<?php
    $json = file_get_contents('php://input');   
    $obj = json_decode($json);
    $id = $obj->flag;
    // Returns a Json
    header('Content-Type: application/json; charset=utf-8');
    
    $conn = new mysqli("directoriofitness.com.mx","direct18","L4LL4v3M@3str@","$obj->bd");
    $fecha_hoy = date('Y-m-d');
    $horarios_clase;
    $horario = $obj->horario;
    $queryActivo = "SELECT * FROM socios WHERE idSocio = $obj->id_cliente AND Activo = 1";
    $resultActivo = $conn->query($queryActivo);
            
    if($resultActivo->num_rows == 0){
        echo 'Cliente inactivo';
        exit();
    }

// Obtener offset de zona horaria del gimnasio
$connCloud = new mysqli("directoriofitness.com.mx", "direct18", "L4LL4v3M@3str@", "direct18_ProGymCloud");
$queryUTC = "SELECT zh.utc FROM zonasHorarias zh 
             INNER JOIN gimnasios g ON zh.id = g.idGimnasio 
             WHERE g.BaseDatos = '$obj->bd' LIMIT 1";
$resultUTC = $connCloud->query($queryUTC);
$offsetHoras = 6; // default México UTC-6
if($resultUTC && $resultUTC->num_rows > 0){
    $rowUTC = $resultUTC->fetch_assoc();
    // utc viene como "UTC-6" o "UTC-5", extraemos el número
    $utcStr = $rowUTC['utc']; // ej: "UTC-6"
    preg_match('/UTC([+-]\d+)/', $utcStr, $matches);
    if(isset($matches[1])){
        $offsetHoras = intval($matches[1]) * -1; // UTC-6 → +6, UTC+5 → -5
    }
}
$connCloud->close();

// Validar sanción activa para esta clase específica
$querySancion = "
    SELECT ss.fecha_fin
    FROM sanciones_socios ss
    INNER JOIN config_sanciones_clase csc ON ss.idClase = csc.idClase
    WHERE ss.idSocio = '$obj->id_cliente'
      AND ss.idClase = '$obj->idClase'
      AND ss.activa = 1
      AND csc.activo = 1
      AND (NOW() + INTERVAL $offsetHoras HOUR) BETWEEN ss.fecha_inicio AND ss.fecha_fin
    LIMIT 1
";
$resultSancion = $conn->query($querySancion);

if($resultSancion && $resultSancion->num_rows > 0){
    $rowSancion = $resultSancion->fetch_assoc();
    $fechaFinFormateada = date('d/m/Y H:i', strtotime($rowSancion['fecha_fin']));
    echo "Tienes una sanción activa para esta clase hasta el $fechaFinFormateada. No puedes reservar.";
    $conn->close();
    exit();
}

        date_default_timezone_set('America/Mexico_City'); 
        $fecha_hoy = date('Y-m-d');
        $fecha_clase = trim(explode(' ', $obj->fechaClase)[0]);  // Solo la parte fecha sin hora ni espacios
        
        // Si la fecha de la clase ya pasó
        if ($fecha_hoy > $fecha_clase) {
            echo "No es posible reservar, la fecha ya pasó.";
            exit();
        }
        
        // Si la clase es hoy, verificar la hora para permitir reservar hasta 15 minutos después de que inicie
        if ($fecha_hoy == $fecha_clase) {
            // El formato esperado es "HH:MM-HH:MM", separa inicio y fin
            $horarios_clase = explode("-", $obj->horario);
            if (count($horarios_clase) != 2) {
                echo "Error: formato de horario inválido.";
                exit();
            }
        
            $hora_inicio = trim($horarios_clase[0]);
            $hora_fin = trim($horarios_clase[1]);
            $hora_actual = date('H:i:s');
        
            // Convertir horas a timestamps
            $timestamp_actual = strtotime($hora_actual);
            $timestamp_inicio = strtotime($hora_inicio);
            $timestamp_fin    = strtotime($hora_fin);
        
            // Validar si ya terminó
            if ($timestamp_actual >= $timestamp_fin) {
                echo "No es posible reservar, la clase ya terminó.";
                exit();
            }
        
            // Permitir reservar hasta 5 minutos después de que inicie
            $tolerancia_segundos = 15 * 60; // 5 minutos en segundos
            $timestamp_limite = $timestamp_inicio + $tolerancia_segundos;
        
            if ($timestamp_actual > $timestamp_limite) {
                echo "No es posible reservar, la clase ya inició hace más de 5 minutos.";
                exit();
            }
        }




            
    $band_clase = FALSE;
    $band_activo = FALSE;
    if(empty($obj->paquetes)){
        echo 'No hay paquetes asignados a esta clase';
        $conn->close();
        exit();
    }
    $queryCupo = "SELECT IF(SUM(fecha_clase.clientes_registrados + 1) > clase.Cupo, 'fail', 'ok') AS condicion, 
        clase.Cupo, SUM(fecha_clase.clientes_registrados + 1) AS clientes_registrados 
        FROM clase INNER JOIN fecha_clase ON clase.idClase = fecha_clase.clase_idClase 
        WHERE fecha_clase.clase_idClase = $obj->idClase AND fecha_clase.fecha_de_clase = '$obj->fechaClase' GROUP BY fecha_clase.id_fecha_clase DESC LIMIT 1";
            
    $resultado_cupo = $conn->query($queryCupo);
            
            
    if($resultado_cupo->num_rows > 0){
        $rowCupo = $resultado_cupo->fetch_assoc();
        if($rowCupo['condicion'] == 'fail'){
            echo 'La clase esta llena';
            exit();
        }
    }
            
    $queryP = "SELECT  * FROM(SELECT 
                socio_servicio.idServicio as 'id',
                pagos.FechaInicio,
                servicios.NombreServicio,
                socio_servicio.idSocio_Servicio AS 'idss',
                socio_servicio.idSocioTitular as 'st',
                pagos.FechaFin,
                socios.Activo
            FROM 
                socio_servicio
                	INNER JOIN pagos
            	        ON socio_servicio.idSocio_Servicio = pagos.idSocio_Servicio
                    INNER JOIN servicios
            	        ON socio_servicio.idServicio = servicios.idServicio
                    INNER JOIN socios
            	        ON socio_servicio.idSocio = socios.idSocio
            WHERE
                socio_servicio.idSocio = '$obj->id_cliente'
                AND pagos.Cancelado = 0  
                AND pagos.Visible = 1
                AND socios.Activo != 0
			GROUP BY
				socio_servicio.idSocio_Servicio DESC
            ) AS tmp
            GROUP BY
            	tmp.id
            ORDER BY
                tmp.idss DESC;";
            
    $resultadoP = $conn->query($queryP);
            
    $band_acceso = TRUE;
            
    $msg = 'No tienes acceso a esta sucursal';
    $insert_idsocio;
    if($resultadoP->num_rows > 0){
        while($row = $resultadoP->fetch_assoc()){
            $idSer = $row["id"];
            //echo $row["Activo"]."\n";
            $subQuery = "SELECT * FROM servicios_sucursal 
                        JOIN servicios ON servicios_sucursal.servicios_idservicio = servicios.idServicio
                        WHERE servicios_sucursal.servicios_idservicio = '$idSer' 
                        AND servicios_sucursal.sucursal_idsucursal = '$obj->sucursal'
                        AND servicios.Borrado != 1";
            $resultado2 = $conn->query($subQuery);
            if($row['Activo'] == '0'){
                $band_activo == TRUE;
            }
                    
            $paquetes_permitidos = explode(',',$obj->paquetes);
            
            if(in_array($row['id'], $paquetes_permitidos) && $band_clase == FALSE){
              if($row['FechaFin'] < $fecha_hoy || $row['FechaFin'] < $obj->fechaClase){
                              echo 'Tu paquete ha vencido para la fecha seleccionada';
                                $conn->close();
                                exit();
                          }else{
                                $band_clase = TRUE;
                           }
            }
            if($resultado2->num_rows > 0){
                while($row_2 = $resultado2->fetch_assoc()){
                    if($obj->sucursal == $row_2['sucursal_idsucursal'] && $msg != 'OK'){
                        $msg = 'OK';
                        //exit();
                    }
                }
            }else{
                $msg = 'OK';
                //break;
            }
            
        }
    }
            
    if($msg != 'OK'){
        echo $msg;
        $conn->close();
        exit();
    }
    if($band_activo == TRUE){
        echo 'Cliente Inactivo';
        $conn->close();
        exit();
    }
    if($band_clase == FALSE){
        echo 'Tu paquete no tiene acceso a la clase';
        $conn->close();
        exit();
    }
    $queryTraslape = "SELECT c.HoraEntrada, c.HoraSalida FROM socio_clase sc
    INNER JOIN clase c ON sc.Clase_idClase = c.idClase
    WHERE sc.Socios_idSocio = '$obj->id_cliente'
    AND sc.fecha_de_clase = '$obj->fechaClase'
    AND sc.status = 1";

$resultadoTraslape = $conn->query($queryTraslape);

$tolerancia_minutos = 10; // minutos permitidos de traslape
$segundos_tolerancia = $tolerancia_minutos * 60;

if ($resultadoTraslape->num_rows > 0) {
    // Obtener horario de la clase que se intenta reservar
    $horarios_nueva_clase = explode('-', $obj->horario);
    $hora_entrada_nueva = trim($horarios_nueva_clase[0]);
    $hora_salida_nueva = trim($horarios_nueva_clase[1]);

    $timestamp_entrada_nueva = strtotime($hora_entrada_nueva);
    $timestamp_salida_nueva = strtotime($hora_salida_nueva);

    while ($fila = $resultadoTraslape->fetch_assoc()) {
        $hora_entrada_existente = strtotime($fila['HoraEntrada']);
        $hora_salida_existente = strtotime($fila['HoraSalida']);

        // Calcular traslape real
        $traslape_inicio = max($timestamp_entrada_nueva, $hora_entrada_existente);
        $traslape_fin = min($timestamp_salida_nueva, $hora_salida_existente);

        $duracion_traslape = $traslape_fin - $traslape_inicio;

        if ($duracion_traslape > 0 && $duracion_traslape > $segundos_tolerancia) {
            echo 'No es posible reservar: ya tienes una clase en ese horario';
            $conn->close();
            exit();
        }
    }
}

            
    $queryBR = "SELECT * FROM socio_clase 
        WHERE Socios_idSocio = '$obj->id_cliente' 
        AND fecha_de_clase = '$obj->fechaClase' 
        AND Clase_idClase = '$obj->idClase'
        AND status = 1";
    $resultadoBR = $conn->query($queryBR);
                
    $resultadoB;
    $row;
    if(mysqli_num_rows($resultadoBR) > 0){
        echo 'Ya cuentas con una reservacion para esta clase';
        $conn->close();
        exit();
    }
    
    // Intentar descontar sesion solo si hay paquete con ConSesion=1 y t_sesion=2
            $paquetes = $obj->paquetes;

            $idAsistencia = null;
            $sesiones_restantes = 0;
            $paqueteDescontado = null;
            $nombrePaquete = null;
            
            // Consulta directamente por el paquete seleccionado
            $consultaSesion = mysqli_query($conn, "
                SELECT aps.id_asistencia_s, aps.ses_restantes, s.NombreServicio
                FROM asistencia_por_sesiones AS aps
                INNER JOIN servicios AS s ON aps.paq_idPaquete = s.idServicio
                WHERE aps.cli_idCliente = '$obj->id_cliente'
                  AND aps.paq_idPaquete = '$paquetes'
                  AND aps.ses_restantes > 0
                  AND s.ConSesion = 1
                  AND s.t_sesion = 2
                  ORDER BY aps.fecha_registro DESC
                LIMIT 1
            ");
            
            $consultaSesion2 = mysqli_query($conn, "
                SELECT aps.id_asistencia_s, aps.ses_restantes, s.NombreServicio
                FROM asistencia_por_sesiones AS aps
                INNER JOIN servicios AS s ON aps.paq_idPaquete = s.idServicio
                WHERE aps.cli_idCliente = '$obj->id_cliente'
                  AND aps.paq_idPaquete = '$paquetes'
                ORDER BY aps.fecha_registro DESC
                LIMIT 1
            ");
        
            if (mysqli_num_rows($consultaSesion2) > 0) {
                $rowSesion = mysqli_fetch_assoc($consultaSesion2);
                $sesiones_restantes = intval($rowSesion['ses_restantes']);
        
                if ($sesiones_restantes <= 0) {
                    echo json_encode(['status' => false, 'msg' => 'Tu paquete ya no tiene sesiones disponibles']);
                    exit();
                }}
            
            if (mysqli_num_rows($consultaSesion) > 0) {
                $rowSesion = mysqli_fetch_assoc($consultaSesion);
                $idAsistencia = $rowSesion['id_asistencia_s'];
                $sesiones_restantes = intval($rowSesion['ses_restantes']);
                $paqueteDescontado = $paquetes;
                $nombrePaquete = $rowSesion['NombreServicio'];
            
                // Descontamos la sesión inmediatamente
                mysqli_query($conn, "
                    UPDATE asistencia_por_sesiones
                    SET ses_restantes = ses_restantes - 1
                    WHERE id_asistencia_s = '$idAsistencia'
                ");
            }
    
    
    $query = "INSERT INTO socio_clase
                    (Clase_idClase, Socios_idSocio, fecha_de_clase, fecha_registro, status, paqueteAsignado)
                VALUES
                    ('$obj->idClase', '$obj->id_cliente', '$obj->fechaClase', '$obj->registro', 1, '$obj->paquetes')";
                
    if($conn->query($query) == TRUE){
        $insert_idsocio = $conn->insert_id;
        //VERIFICAMOS QUE LA CLASE ESTE REGISTRADA
        $querys = "SELECT fecha_clase.*, clase.Cupo FROM 
    	     fecha_clase JOIN clase ON fecha_clase.clase_idClase = clase.idClase 
    	   WHERE fecha_de_clase ='$obj->fechaClase' AND clase_idClase = '$obj->idClase'";
                    
        $resultados = $conn->query($querys);
        $queryUdt;
        if($resultados->num_rows > 0){
            $numCliente = $row['clientes_registrados'];
            $num = intval($numCliente + 1) ;
            $queryUdt = "UPDATE fecha_clase SET clientes_registrados = (clientes_registrados +1)
                WHERE fecha_de_clase = '$obj->fechaClase' AND clase_idClase = '$obj->idClase'";
        }else{
            $queryUdt = "INSERT fecha_clase(clase_idClase,clientes_registrados,fecha_de_clase)
                VALUES('$obj->idClase','1','$obj->fechaClase')"; 
        }
        if($conn->query($queryUdt) == TRUE){
            //echo 'Success';
            //  query lugar
            $queryLugar = "INSERT INTO reservar_lugar(idSocio, id_socioclase, Clase_idclase, lugar, fecha_clase, cancelado) 
                VALUES ($obj->id_cliente,$insert_idsocio,$obj->idClase,'$obj->lugar','$obj->fechaClase', 0)";
            
            if($conn->query($queryLugar) == TRUE){
                echo '1';
            }else{
                echo '2 '.$queryLugar;
            }
                        
        }else{
            echo 'Error '.$queryUdt;
        }
                
        
    } else{
        echo 'Error '.$query;
    }    
                
    
    
    
    $conn->close();
    
?>