<?php
class Estacionamiento{

	private $cn = null;

	function __construct(){
		$this->cn = conectarDB();
	}

	public function cliente($cli_id,$est_id){
		$query = 'SELECT 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, DATE_FORMAT(cli_entrada,"%H:%i:%s %d-%m-%Y") AS f_entrada, 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 obtenerUno($id){
		$query = 'SELECT IF(est_nombre = "" OR est_nombre IS NULL,CONCAT("Estacionamiento ",est_id),est_nombre) AS nombre, est_telefono AS telefono, 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 buscar($cercania,$promedio,$disponible,$nombre,$precio,$servicio,$latitud,$longitud,$limit,$offset){
		$orderBy = 'ORDER BY ';
		if($cercania == '1'){
			$orderBy .= 'distancia ASC ';
			if($promedio == '1'){
				$orderBy .= ', promedio DESC ';
				if($precio == '1'){
					$orderBy .= ', pre_hora ASC ';
				}
			}elseif($precio == '1'){
				$orderBy .= ', pre_hora ASC ';
			}
		}elseif($promedio == '1'){
			$orderBy .= 'promedio DESC ';
			if($precio == '1'){
				$orderBy .= ', pre_hora ASC ';
			}
		}elseif($precio == '1'){
			$orderBy .= 'pre_hora ASC ';
		}else{
			$orderBy = '';
		}

		$where = 'WHERE ';
		if($precio == '1'){
			$where .= 'pre_hora IS NOT NULL ';
			if(!empty($servicio)){
				$where .= 'AND ser_nombre LIKE "%'.$servicio.'%" ';
			}
		}elseif(!empty($servicio)){
			$where .= 'ser_nombre LIKE "%'.$servicio.'%" ';
		}else{
			$where = '';
		}

		$groupBy = '';
		if(!empty($servicio)){
			$groupBy .= ', ser_nombre';
		}

		$having = '';
		if($disponible == '1'){
			$having .= ' AND disponibilidad = 1 ';
			if(!empty($nombre)){
				$having .= ' AND nombre LIKE "%'.$nombre.'%" ';
			}
		}elseif(!empty($nombre)){
			$having .= ' AND nombre LIKE "%'.$nombre.'%" ';
		}

		$query = 'SELECT e.est_id AS id, IF(e.est_nombre = "" OR e.est_nombre IS NULL,CONCAT("Estacionamiento ",e.est_id),e.est_nombre) AS nombre, ROUND(6378137 *
		ACOS(SIN(RADIANS(e.est_latitud)) * SIN(RADIANS( ? )) + COS(RADIANS(e.est_longitud - ?)) *
		COS(RADIANS(e.est_latitud)) * COS(RADIANS( ? )))) AS distancia, e.est_disponibilidad AS disponibilidad, DATE_FORMAT(e.est_editado,"%d-%m-%Y") AS actualizado, IFNULL(FORMAT(AVG(uce.uce_valoracion),1),0) AS promedio, est_latitud AS latitud, est_longitud AS longitud, pre_hora AS precio, ser_nombre
					FROM estacionamiento AS e
					LEFT JOIN usu_califica_est AS uce ON e.est_id = uce.estacionamiento_est_id
					LEFT JOIN precio AS p ON p.estacionamiento_est_id = e.est_id
					LEFT JOIN servicio_adicional AS s ON s.estacionamiento_est_id = e.est_id
					'.$where.'
					GROUP BY e.est_id'.$groupBy.' HAVING distancia < 30000'.$having.'
					'.$orderBy.'
					LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($latitud,$longitud,$latitud,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$estacionamientos = $rs->GetArray();
			$rs->Close();
			return $estacionamientos;
		}
		return false;
	}

	public function cercanos($latitud,$longitud,$distanciaMaxima,$limit,$offset){
		$query = 'SELECT e.est_id AS id, IF(e.est_nombre = "" OR e.est_nombre IS NULL,CONCAT("Estacionamiento ",e.est_id),e.est_nombre) AS nombre, ROUND(6378137 *
		ACOS(SIN(RADIANS(e.est_latitud)) * SIN(RADIANS( ? )) + COS(RADIANS(e.est_longitud - ?)) *
		COS(RADIANS(e.est_latitud)) * COS(RADIANS( ? )))) AS distancia, e.est_disponibilidad AS disponibilidad, DATE_FORMAT(e.est_editado,"%d-%m-%Y") AS actualizado, IFNULL(FORMAT(AVG(uce.uce_valoracion),1),0) AS promedio, est_latitud AS latitud, est_longitud AS longitud
					FROM estacionamiento AS e
					LEFT JOIN usu_califica_est AS uce ON e.est_id = uce.estacionamiento_est_id
					GROUP BY e.est_id HAVING distancia < ? ORDER BY distancia ASC
					LIMIT ? OFFSET ?;';
		$rs = $this->cn->Execute($query,array($latitud,$longitud,$latitud,$distanciaMaxima,$limit,$offset));
		if(!empty($rs) && !$rs->EOF){
			$estacionamientos = $rs->GetArray();
			$rs->Close();
			return $estacionamientos;
		}
		return false;
	}

	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 = ?
					WHERE est_id = ?;';
		$rs = $this->cn->Execute($query,array($nombre,$telefono,$latitud,$longitud,$direccion,$horario,$descripcion,$id));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function actualizarDisponibilidad($id,$disponibilidad){
		$query = 'UPDATE estacionamiento
					SET est_disponibilidad = ?
					WHERE est_id = ?;';
		$rs = $this->cn->Execute($query,array($disponibilidad,$id));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function precios($id){
		$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, c.car_nombre AS carroceria
					FROM precio AS p JOIN carroceria AS c ON c.car_id = p.carroceria_car_id
					WHERE p.estacionamiento_est_id = ?	ORDER BY c.car_id ASC;';
		$rs = $this->cn->Execute($query,array($id));
		if(!empty($rs) && !$rs->EOF){
			$precios = $rs->GetArray();
			$rs->Close();
			return $precios;
		}
		return false;
	}

	public function agregarPrecio($minimo,$hora,$tiempoExtra,$valorTiempoExtra,$idCarroceria,$idEstacionamiento){
		$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,$tiempoExtra,$valorTiempoExtra,$idCarroceria,$idEstacionamiento));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function actualizarPrecio($id,$minimo,$hora,$tiempoExtra,$valorTiempoExtra,$idCarroceria){
		$query = 'UPDATE pre_minimo = ?, pre_hora = ?, pre_tiempo_extra = ?, pre_valor_tiempo_extra = ?, carroceria_car_id = ?
					WHERE pre_id = ?;';
		$rs = $this->cn->Execute($query,array($minimo,$hora,$tiempoExtra,$valorTiempoExtra,$idCarroceria,$id));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function serviciosAdicionales($id){
		$query = 'SELECT ser_id AS id, ser_nombre AS nombre, ser_valor AS valor
					FROM servicio_adicional
					WHERE estacionamiento_est_id = ? AND ser_estado = 1;';
		$rs = $this->cn->Execute($query,array($id));
		if(!empty($rs) && !$rs->EOF){
			$precios = $rs->GetArray();
			$rs->Close();
			return $precios;
		}
		return false;
	}

	public function agregarServicioAdicional($nombre,$valor,$idEstacionamiento){
		$query = 'INSERT INTO servicio_adicional(ser_nombre, ser_nombre, estacionamiento_est_id) VALUES (?,?,?);';
		$rs = $this->cn->Execute($query,array($nombre,$valor,$idEstacionamiento));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function actualizarServicioAdicional($id,$nombre,$valor){
		$query = 'UPDATE servicio_adicional SET ser_nombre = ?, ser_valor = ?
					WHERE ser_id = ?;';
		$rs = $this->cn->Execute($query,array($nombre,$valor,$id));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

	public function calificar($idUsuario,$idEstacionamiento,$valoracion,$comentario){
		$query = 'INSERT INTO usu_califica_est VALUES (?,?,?,?,NOW());';
		$rs = $this->cn->Execute($query,array($idUsuario,$idEstacionamiento,$valoracion,$comentario));
		if($this->cn->Affected_Rows()==1)
			return true;
		return false;
	}

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

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