<?php
class Estacionamiento{
	
	function __construct(){
		$this->cn = conectarDB();
	}

	public function actualizarDatos($id,$nombre,$telefono,$latitud,$longitud,$direccion,$horario,$descripcion){
		$query = 'UPDATE estacionamiento SET est_nombre = ?, est_telefono = ?, est_latitud = ?, est_longitud = ?, est_direccion = ?, est_horario = ?, est_descripcion = ?, est_editado = NOW() WHERE est_id = ?;';
		$rs = $this->cn->Execute($query,array($nombre,$telefono,$latitud,$longitud,$direccion,$horario,$descripcion,$id));
		if($this->cn->Affected_Rows()==1){
			$query = 'UPDATE estacionamiento SET est_editado = NOW() WHERE est_id = ?;';
			$rs = $this->cn->Execute($query,array($id));
			$rs->Close();
			return true;
		}
		return false;
	}

	public function eliminar($id){
		$query = 'DELETE FROM estacionamiento WHERE est_id = ? LIMIT 1;';
		$this->cn->Execute($query,array($id));
		if($this->cn->Affected_Rows()==1){
			$_SESSION['usuario']['cant_e']--;
			return true;
		}
		return false;
	}

	public function disponibilidad(){
		$disponibilidad = ($_SESSION['usuario']['disponibilidad'] == 'Disponible')?0:1;
		$query = 'UPDATE estacionamiento SET est_disponibilidad = ?, est_editado = NOW() WHERE est_id = ?;';
		$rs = $this->cn->Execute($query,array($disponibilidad,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1){
			$_SESSION['usuario']['disponibilidad'] = ($disponibilidad == 1)?'Disponible':'No disponible';
			$rs->Close();
			return true;
		}
		return false;
	}

	public function obtener($id){
		$query = 'SELECT est_nombre AS nombre, est_telefono AS telefono, est_latitud AS latitud, est_longitud AS longitud, est_direccion AS direccion, est_horario AS horario, est_descripcion AS descripcion
					FROM estacionamiento
					WHERE est_id = ? LIMIT 1;';
		$rs = $this->cn->Execute($query,array($id));
		if(!empty($rs) && !$rs->EOF){
			$estacionamiento = $rs->GetArray();
			$rs->Close();
			return $estacionamiento[0];
		}
		return false;
	}

	public function todos(){
		$query = 'SELECT est_id AS id, IF(est_nombre<>"",est_nombre,CONCAT("Estacionamiento ",est_id)) AS nombre, IF(uae_termino<=NOW(),"Expiró",IF(uae_estado=1,"Activo","Desactivado")) AS estado, DATE_FORMAT(uae_termino,"%d-%m-%Y") AS expira, IF(est_disponibilidad=1,"Disponible","No disponible") AS disponibilidad, est_direccion AS direccion, DATE_FORMAT(est_editado,"%H:%i:%s el %d-%m-%Y") AS ultima_actualizacion, IFNULL(FORMAT(AVG(uce.uce_valoracion),1),0) AS promedio, COUNT(uce_comentario) AS comentario
					FROM usuario LEFT JOIN usu_administra_est AS uae ON usu_id = uae.usuario_usu_id LEFT JOIN estacionamiento ON uae.estacionamiento_est_id = est_id LEFT JOIN usu_califica_est AS uce ON est_id = uce.estacionamiento_est_id
					WHERE usu_id = ? GROUP BY est_id ORDER BY estado, disponibilidad ASC, est_editado DESC;';
		$rs = $this->cn->Execute($query,array($_SESSION['usuario']['id']));
		if(!empty($rs) && !$rs->EOF){
			$estacionamientos = $rs->GetArray();
			$rs->Close();
			return $estacionamientos;
		}
		return false;
	}

	public function comentarios($id){
		$query = 'SELECT usu_apodo AS usuario, DATE_FORMAT(uce_fecha,"%d-%m-%Y") AS fecha, uce_valoracion AS valoracion, uce_comentario AS comentario
					FROM usu_califica_est LEFT JOIN usuario ON usuario_usu_id = usu_id
					WHERE uce_comentario IS NOT NULL AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($id));
		if(!empty($rs) && !$rs->EOF){
			$comentarios = $rs->GetArray();
			$rs->Close();
			return $comentarios;
		}
		return false;
	}

	public function servicio($id){
		$query = 'SELECT ser_id AS id, ser_nombre AS nombre, ser_valor AS valor, ser_estado AS estado_id, IF(ser_estado=1,"Activo","Obsoleto") AS estado_nombre
					FROM estacionamiento LEFT JOIN servicio_adicional ON est_id = estacionamiento_est_id
					WHERE ser_id = ? AND est_id = ? LIMIT 1;';
		$rs = $this->cn->Execute($query,array($id,$_SESSION['usuario']['estacionamiento']));
		if(!empty($rs) && !$rs->EOF){
			$servicio = $rs->GetArray();
			$rs->Close();
			return $servicio[0];
		}
		return false;
	}

	public function servicios(){
		$query = 'SELECT ser_id AS id, ser_nombre AS nombre, ser_valor AS valor, IF(ser_estado=1,"Activo","Obsoleto") AS estado
					FROM estacionamiento LEFT JOIN servicio_adicional ON est_id = estacionamiento_est_id
					WHERE est_id = ? ORDER BY estado ASC;';
		$rs = $this->cn->Execute($query,array($_SESSION['usuario']['estacionamiento']));
		if(!empty($rs) && !$rs->EOF){
			$servicios = $rs->GetArray();
			$rs->Close();
			return $servicios;
		}
		return false;
	}

	public function serviciosEstado($estado){
		$query = 'SELECT ser_id AS id, ser_nombre AS nombre, ser_valor AS valor
					FROM estacionamiento LEFT JOIN servicio_adicional ON est_id = estacionamiento_est_id
					WHERE est_id = ? AND ser_estado = ? ORDER BY nombre ASC;';
		$rs = $this->cn->Execute($query,array($_SESSION['usuario']['estacionamiento'],$estado));
		if(!empty($rs) && !$rs->EOF){
			$servicios = $rs->GetArray();
			$rs->Close();
			return $servicios;
		}
		return false;
	}

	public function nuevoServicio($nombre,$valor,$estado){
		$query = 'INSERT INTO servicio_adicional(ser_nombre,ser_valor,ser_estado,estacionamiento_est_id) VALUES(?,?,?,?);';
		$rs = $this->cn->Execute($query,array($nombre,$valor,$estado,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function nuevoServicioCliente($cliente,$servicio){
		$query = 'INSERT INTO cli_utiliza_ser(cliente_estacionado_cli_id,servicio_adicional_ser_id,cus_fecha) VALUES(?,?,NOW());';
		$this->cn->Execute($query,array($cliente,$servicio));
		if($this->cn->Affected_Rows()==1){
			$servicio = $this->servicio($servicio);
			$cliente = $this->cliente($cliente,$_SESSION['usuario']['estacionamiento']);
			$query = 'UPDATE cliente_estacionado SET cli_monto = ? WHERE cli_id = ?;';
			$this->cn->Execute($query,array(($cliente['monto']+$servicio['valor']),$cliente['id']));
			if($this->cn->Affected_Rows()==1)
				return true;
		}
		return false;
	}

	public function eliminarServicioCliente($cliente,$servicio){
		$query = 'DELETE FROM cli_utiliza_ser WHERE cliente_estacionado_cli_id = ? AND servicio_adicional_ser_id = ? ORDER BY cus_fecha DESC LIMIT 1;';
		$this->cn->Execute($query,array($cliente,$servicio,$cliente,$servicio));
		if($this->cn->Affected_Rows()==1){
			$servicio = $this->servicio($servicio);
			$cliente = $this->cliente($cliente,$_SESSION['usuario']['estacionamiento']);
			$query = 'UPDATE cliente_estacionado SET cli_monto = ? WHERE cli_id = ?;';
			$this->cn->Execute($query,array(($cliente['monto']-$servicio['valor']),$cliente['id']));
			if($this->cn->Affected_Rows()==1)
				return true;
		}
		return false;
	}

	public function actualizarServicio($id,$nombre,$valor,$estado){
		$query = 'UPDATE servicio_adicional SET ser_nombre = ?, ser_valor = ?, ser_estado = ? WHERE ser_id = ? AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($nombre,$valor,$estado,$id,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function precio($id){
		$query = 'SELECT pre_minimo AS minimo, pre_hora AS hora, pre_tiempo_extra AS tiempo_extra, pre_valor_tiempo_extra AS valor_tiempo_extra, car_id, car_nombre
					FROM precio AS pre LEFT JOIN carroceria AS car ON pre.carroceria_car_id = car.car_id
					WHERE pre.estacionamiento_est_id = ?
						AND pre.pre_id = ?
					ORDER BY pre_id ASC LIMIT 1;';
		$rs = $this->cn->Execute($query,array($_SESSION['usuario']['estacionamiento'],$id));
		if(!empty($rs) && !$rs->EOF){
			$precios = $rs->GetArray();
			$rs->Close();
			return $precios[0];
		}
		return false;
	}

	public function precios(){
		$query = 'SELECT pre_id AS id, pre_minimo AS minimo, pre_hora AS hora, pre_tiempo_extra AS tiempo_extra, pre_valor_tiempo_extra AS valor_tiempo_extra, car_nombre AS carroceria
					FROM precio AS pre LEFT JOIN carroceria AS car ON pre.carroceria_car_id = car.car_id
					WHERE pre.estacionamiento_est_id = ?
					ORDER BY pre_id ASC;';
		$rs = $this->cn->Execute($query,array($_SESSION['usuario']['estacionamiento']));
		if(!empty($rs) && !$rs->EOF){
			$precios = $rs->GetArray();
			$rs->Close();
			return $precios;
		}
		return false;
	}

	public function nuevoPrecio($minimo,$hora,$tiempo_extra,$valor_tiempo_extra,$car_id){
		$query = 'INSERT INTO precio(pre_minimo, pre_hora, pre_tiempo_extra, pre_valor_tiempo_extra, carroceria_car_id, estacionamiento_est_id) VALUES(?,?,?,?,?,?);';
		$rs = $this->cn->Execute($query,array($minimo,$hora,$tiempo_extra,$valor_tiempo_extra,$car_id,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function salida($cliente,$ahora,$monto,$observacion){
		$query = 'UPDATE cliente_estacionado SET cli_salida = STR_TO_DATE(?,"%H:%i:%s %d-%m-%Y"), cli_monto = ?, cli_observacion = ? WHERE cli_id = ? AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($ahora,$monto,$observacion,$cliente,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function pagar($cliente,$cancelado,$observacion){
		$query = 'UPDATE cliente_estacionado SET cli_pagado = ?, cli_observacion = ? WHERE cli_id = ? AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($cancelado,$observacion,$cliente,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function eliminarPrecio($id){
		$query = 'DELETE FROM precio WHERE pre_id = ? AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($id,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function actualizarPrecio($id,$minimo,$hora,$tiempo_extra,$valor_tiempo_extra,$car_id){
		$query = 'UPDATE precio SET pre_minimo = ?, pre_hora = ?, pre_tiempo_extra = ?, pre_valor_tiempo_extra = ?, carroceria_car_id = ? WHERE pre_id = ? AND estacionamiento_est_id = ?;';
		$rs = $this->cn->Execute($query,array($minimo,$hora,$tiempo_extra,$valor_tiempo_extra,$car_id,$id,$_SESSION['usuario']['estacionamiento']));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function verificarCarroceriaPrecio($id,$car_id){
		if(empty($id)){
			$query = 'SELECT pre_id IS NOT NULL AS existe
					FROM precio
					WHERE carroceria_car_id = ? AND estacionamiento_est_id = ?;';
			$rs = $this->cn->Execute($query,array($car_id,$_SESSION['usuario']['estacionamiento']));
		}else{
			$query = 'SELECT pre_id IS NOT NULL AS existe
					FROM precio
					WHERE pre_id <> ? AND carroceria_car_id = ? AND estacionamiento_est_id = ?;';
			$rs = $this->cn->Execute($query,array($id,$car_id,$_SESSION['usuario']['estacionamiento']));
		}
		if(!empty($rs) && !$rs->EOF){
			return true;
		}
		return false;
	}

	public function carrocerias(){
		$query = 'SELECT car_id AS id, car_nombre AS nombre
					FROM carroceria
					ORDER BY id ASC;';
		$rs = $this->cn->Execute($query);
		if(!empty($rs) && !$rs->EOF){
			$carrocerias = $rs->GetArray();
			$rs->Close();
			return $carrocerias;
		}
		return false;
	}

	public function clientes($id,$limit,$offset){
		$query = 'SELECT cli_id AS id, IFNULL(usu_apodo,"Sin registrar") AS cliente, DATE_FORMAT(urc_fecha,"%H:%i:%s %d-%m-%Y") AS fecha, cli_patente AS patente, car_nombre AS carroceria, IF(cli_monto=cli_pagado,"Cancelado",IF(cli_pagado<>0,"Abonó","Sin cancelar")) AS estado
					FROM cliente_estacionado AS cli LEFT JOIN carroceria AS car ON cli.carroceria_car_id = car.car_id LEFT JOIN usu_registra_cli AS urc ON cli.cli_id = urc.cliente_estacionado_cli_id LEFT JOIN usuario AS usu ON  usu.usu_id = cli.usuario_usu_id
					WHERE cli.estacionamiento_est_id = ?
					ORDER BY urc_fecha DESC LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($id,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$clientes = $rs->GetArray();
			$rs->Close();
			return $clientes;
		}
		return false;
	}

	public function cliente($cli_id,$est_id){
		$query = 'SELECT cli_id AS id,IFNULL(usu_apodo,"Sin registrar") AS cliente, DATE_FORMAT(urc_fecha,"%H:%i:%s %d-%m-%Y") AS fecha, cli_patente AS patente, car_nombre AS carroceria, IFNULL(cli_monto,0) AS monto, IFNULL(cli_pagado,0) AS pagado, IFNULL(DATE_FORMAT(cli_entrada,"%H:%i:%s %d-%m-%Y"),"-") AS f_entrada, IFNULL(DATE_FORMAT(cli_salida,"%H:%i:%s %d-%m-%Y"),"-") AS f_salida, cli_observacion AS observacion
					FROM cliente_estacionado AS cli LEFT JOIN carroceria AS car ON cli.carroceria_car_id = car.car_id LEFT JOIN usu_registra_cli AS urc ON cli.cli_id = urc.cliente_estacionado_cli_id LEFT JOIN usuario AS usu ON  usu.usu_id = cli.usuario_usu_id
					WHERE cli.cli_id = ? AND cli.estacionamiento_est_id = ? LIMIT 1;';
		$rs = $this->cn->Execute($query,array($cli_id,$est_id));
		if(!empty($rs) && !$rs->EOF){
			$cliente = $rs->GetArray();
			$rs->Close();
			return $cliente[0];
		}
		return false;
	}

	public function serviciosCliente($cli_id,$est_id){
		$query = 'SELECT ser_id AS id, ser_nombre AS servicio, ser_valor AS valor, DATE_FORMAT(cus_fecha,"%H:%i:%s %d-%m-%Y") AS fecha
					FROM cliente_estacionado AS cli	RIGHT JOIN cli_utiliza_ser AS cus ON cli.cli_id = cus.cliente_estacionado_cli_id RIGHT JOIN servicio_adicional AS ser ON ser.ser_id = cus.servicio_adicional_ser_id
					WHERE cli.cli_id = ? AND cli.estacionamiento_est_id = ?
					ORDER BY cus_fecha DESC;';
		$rs = $this->cn->Execute($query,array($cli_id,$est_id));
		if(!empty($rs) && !$rs->EOF){
			$servicios = $rs->GetArray();
			$rs->Close();
			return $servicios;
		}
		return false;
	}

	public function clientesActuales($id,$limit,$offset){
		$query = 'SELECT cli_id AS id, IFNULL(usu_apodo,"Sin registrar") AS cliente, DATE_FORMAT(urc_fecha,"%H:%i:%s %d-%m-%Y") AS fecha, cli_patente AS patente, car_nombre AS carroceria, IF(cli_monto=cli_pagado,"Cancelado",IF(cli_pagado<>0,"Abonó","Sin cancelar")) AS estado
					FROM cliente_estacionado AS cli LEFT JOIN carroceria AS car ON cli.carroceria_car_id = car.car_id LEFT JOIN usu_registra_cli AS urc ON cli.cli_id = urc.cliente_estacionado_cli_id LEFT JOIN usuario AS usu ON  usu.usu_id = cli.usuario_usu_id
					WHERE cli.estacionamiento_est_id = ? AND (cli_monto > cli_pagado OR cli_pagado IS NULL)
					ORDER BY urc_fecha DESC LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($id,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$clientes = $rs->GetArray();
			$rs->Close();
			return $clientes;
		}
		return false;
	}

	public function clientesEstacionados($id,$limit,$offset){
		$query = 'SELECT cli_id AS id, IFNULL(usu_apodo,"Sin registrar") AS cliente, DATE_FORMAT(urc_fecha,"%H:%i:%s %d-%m-%Y") AS fecha, cli_patente AS patente, car_nombre AS carroceria, IF(cli_monto=cli_pagado,"Cancelado",IF(cli_pagado<>0,"Abonó","Sin cancelar")) AS estado
					FROM cliente_estacionado AS cli LEFT JOIN carroceria AS car ON cli.carroceria_car_id = car.car_id LEFT JOIN usu_registra_cli AS urc ON cli.cli_id = urc.cliente_estacionado_cli_id LEFT JOIN usuario AS usu ON  usu.usu_id = cli.usuario_usu_id
					WHERE cli.estacionamiento_est_id = ? AND cli.cli_entrada IS NOT NULL AND cli.cli_salida IS NULL
					ORDER BY urc_fecha DESC LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($id,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$clientes = $rs->GetArray();
			$rs->Close();
			return $clientes;
		}
		return false;
	}

	public function clientesServiciosAdicionales($id,$limit,$offset){
		$query = 'SELECT DISTINCT cli_id AS id, IFNULL(usu_apodo,"Sin registrar") AS cliente, DATE_FORMAT(urc_fecha,"%H:%i:%s %d-%m-%Y") AS fecha, cli_patente AS patente, car_nombre AS carroceria, IF(cli_monto=cli_pagado,"Cancelado",IF(cli_pagado<>0,"Abonó","Sin cancelar")) AS estado
					FROM cliente_estacionado AS cli LEFT JOIN carroceria AS car ON cli.carroceria_car_id = car.car_id LEFT JOIN usu_registra_cli AS urc ON cli.cli_id = urc.cliente_estacionado_cli_id LEFT JOIN usuario AS usu ON  usu.usu_id = cli.usuario_usu_id RIGHT JOIN cli_utiliza_ser AS cur ON cli.cli_id =  cur.cliente_estacionado_cli_id
					WHERE cli.estacionamiento_est_id = ?
					ORDER BY urc_fecha DESC LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($id,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$clientes = $rs->GetArray();
			$rs->Close();
			return $clientes;
		}
		return false;
	}

	public function nuevoCliente($estaciona,$patente,$carroceria,$observacion){
		if($estaciona){
			$query = 'INSERT INTO cliente_estacionado(cli_patente, cli_entrada, cli_observacion, carroceria_car_id, estacionamiento_est_id) VALUES(?,NOW(),?,?,?);';
			$this->cn->Execute($query,array($patente,$observacion,$carroceria,$_SESSION['usuario']['estacionamiento']));
		}else{
			$query = 'INSERT INTO cliente_estacionado(cli_patente, cli_observacion, carroceria_car_id, estacionamiento_est_id) VALUES(?,?,?,?);';
			$this->cn->Execute($query,array($patente,$observacion,$carroceria,$_SESSION['usuario']['estacionamiento']));
		}
		if($this->cn->Affected_Rows()==1){
			$id = $this->cn->insert_ID();
			$query = 'INSERT INTO usu_registra_cli(usuario_usu_id, cliente_estacionado_cli_id, urc_fecha) VALUES(?,?,NOW());';
			$this->cn->Execute($query,array($_SESSION['usuario']['id'],$id));
			if($this->cn->Affected_Rows()==1){
				return $id;
			}
		}
		return false;
	}

	public function nuevoClienteRegistrado($estaciona,$usu_id,$patente,$observacion){
		$veh = new Vehiculo();
		$carroceria = $veh->carroceria($patente,$usu_id);
		if($estaciona){
			$query = 'INSERT INTO cliente_estacionado(cli_patente, cli_entrada, cli_observacion, carroceria_car_id, usuario_usu_id, estacionamiento_est_id) VALUES(?,NOW(),?,?,?,?);';
			$this->cn->Execute($query,array($patente,$observacion,$carroceria,$usu_id,$_SESSION['usuario']['estacionamiento']));
		}else{
			$query = 'INSERT INTO cliente_estacionado(cli_patente, cli_observacion, carroceria_car_id, usuario_usu_id, estacionamiento_est_id) VALUES(?,?,?,?,?);';
			$this->cn->Execute($query,array($patente,$observacion,$carroceria,$usu_id,$_SESSION['usuario']['estacionamiento']));
		}
		if($this->cn->Affected_Rows()==1){
			$id = $this->cn->insert_ID();
			$query = 'INSERT INTO usu_registra_cli(usuario_usu_id, cliente_estacionado_cli_id, urc_fecha) VALUES(?,?,NOW());';
			$this->cn->Execute($query,array($_SESSION['usuario']['id'],$id));
			if($this->cn->Affected_Rows()==1){
				return $id;
			}
		}
		return false;
	}

	public function verificaClienteEstacionado($usu_id,$patente){
		$query = 'SELECT IF(COUNT(*)=0,true,false) AS resultado FROM cliente_estacionado WHERE usuario_usu_id = ? AND cli_patente = ? AND cli_entrada IS NOT NULL AND cli_salida IS NULL;';
		$rs = $this->cn->Execute($query,array($usu_id,$patente));
		if(!empty($rs) && !$rs->EOF){
			$resultado = $rs->GetArray();
			$rs->Close();
			return $resultado[0]['resultado'];
		}
		return false;
	}

	public function eliminarCliente($id){
		$query = 'DELETE FROM cliente_estacionado WHERE cli_id = ?;';
		$this->cn->Execute($query,array($id));

		if($this->cn->Affected_Rows()==1){
			return true;
		}
		return false;
	}

	function __destruct(){
		$this->cn->Close();
	}
}
?>