<?php
    $json = file_get_contents('php://input');   
    $obj = json_decode($json);
    $id = $obj->flag;
    // Returns a Json
    header('Content-Type: application/json');
    date_default_timezone_set('America/Mexico_City');
    
    switch($id){
        case '0': // RESERVAR CLASE
            $conn = new mysqli("directoriofitness.com.mx", "direct18", "L4LL4v3M@3str@",$obj->bd);
            date_default_timezone_set('America/Mexico_City');
            $fecha_hoy = date('Y-m-d');
            
            // 1. Validar cliente activo
            $queryActivo = "SELECT * FROM socios WHERE idSocio = $obj->id_cliente AND Activo = 1";
            $resultActivo = $conn->query($queryActivo);
            
            if($resultActivo->num_rows == 0){
                echo json_encode(['status' => false, 'msg' => '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 json_encode(['status' => false, 'msg' => "Tienes una sancion activa para esta clase hasta el $fechaFinFormateada. No puedes reservar."]);
    $conn->close();
    exit();
}
            
           // 2. Validar hora de la clase
                if ($fecha_hoy == $obj->fechaClase) {
                    $horarios_clase = explode("-", $obj->horario);
                    $hora_inicio = trim($horarios_clase[0]);
                    $hora_hoy = date('H:i:s');
                
                    // Permitir reservar hasta 15 minutos despu¨¦s del inicio
                    $hora_limite = date('H:i:s', strtotime($hora_inicio . ' +15 minutes'));
                
                    if (strtotime($hora_hoy) > strtotime($hora_limite)) {
                        echo json_encode(['status' => false, 'msg' => 'No es posible reservar, la clase finalizo']);
                        exit();
                    }
                }

            
            // 3. Validar que la clase tiene paquetes asociados
            if (empty($obj->paquetes)) {
                echo json_encode(['status' => false, 'msg' => 'No hay paquetes asignados a esta clase']);
                exit();
            }
            
            // 4. Separar horarios
            $horarios_clase = explode("-", $obj->horario);
            $obj->horaEntrada = trim($horarios_clase[0]);
            $obj->horaSalida = trim($horarios_clase[1]);
            
            // 5. Validar cupo de la clase
             $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 json_encode(['status' => false, 'msg' => 'La clase esta llena.']);
                    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 json_encode(['status' => false, 'msg' => 'Ya cuentas con una reservacion para esta clase.']);

                    $conn->close();

                    exit();
                }
            
            
            
            
            // 6. Validar traslapes de horario
            $queryCheckTraslape = "
                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
            ";
            $resultCheckTraslape = $conn->query($queryCheckTraslape);
            $tolerancia_minutos = 10;
            $segundos_tolerancia = $tolerancia_minutos * 60;
            $hora_inicio_nueva = strtotime($obj->horaEntrada);
            $hora_fin_nueva = strtotime($obj->horaSalida);
            
            if ($resultCheckTraslape->num_rows > 0) {
                while ($fila = $resultCheckTraslape->fetch_assoc()) {
                    $hora_inicio_existente = strtotime($fila['HoraEntrada']);
                    $hora_fin_existente = strtotime($fila['HoraSalida']);
            
                    $hay_traslape = $hora_inicio_nueva < $hora_fin_existente && $hora_fin_nueva > $hora_inicio_existente;
            
                    if ($hay_traslape) {
                        $traslape_inicio = max($hora_inicio_nueva, $hora_inicio_existente);
                        $traslape_fin = min($hora_fin_nueva, $hora_fin_existente);
                        $duracion_traslape = $traslape_fin - $traslape_inicio;
            
                        if ($duracion_traslape > $segundos_tolerancia) {
                            echo json_encode(['status' => false, 'msg' => 'No es posible reservar: ya tienes una clase en ese horario.']);
                            exit();
                        }
                    }
                }
            }
            
            
            
            
            
                //VALIDA FECHA DE CADA PAQUETE QUE SE TENGA
                
                
                
                /*------------------SE BUSCA LOS PLANES QUE TIENE EL USUARIO---------------------*/
                    $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);
                    
                    //Se trae los paquetes que se mandan desde la app
                    $paquetes_permitidos = explode(',', $obj->paquetes);
                    
                    //Si la query trae resultados entra al if
                    if ($resultadoP && $resultadoP->num_rows > 0) {
                        $paquete_valido = false;
                        $paquete_vencido = false;
                        $paquete_permitido = false;
                    
                        while ($row = $resultadoP->fetch_assoc()) {
                    
                            // Verificamos si el paquete actual est¨¢ en la lista permitida, si no continua el ciclo while con el siguiente paquete
                            if (!in_array($row['id'], $paquetes_permitidos)) {
                                continue; // no aplica, pasamos al siguiente
                            }
                    
                            //Si el paquete si estaba permitido continua
                            
                            $paquete_permitido = true; // al menos uno de los paquetes es permitido
                    
                            // Si la fecha de fin est¨¢ vac¨ªa, vencida hoy o antes de la fecha de la clase
                            if (
                                empty($row['FechaFin']) ||
                                strtotime($row['FechaFin']) < strtotime($fecha_hoy) ||
                                strtotime($row['FechaFin']) < strtotime($obj->fechaClase)
                            ) {
                                $paquete_vencido = true; // este paquete est¨¢ vencido, seguimos buscando otro
                                continue;
                            }
                    
                            // Si llega aqu¨ª, este paquete est¨¢ vigente
                            $paquete_valido = true;
                            break;
                        }
                    
                        // Si ning¨²n paquete permitido fue encontrado
                        if (!$paquete_permitido) {
                            echo json_encode(['status' => false, 'msg' => 'Tu paquete no tiene acceso a la clase']);
                            $conn->close();
                            exit();
                        }
                    
                        // Si s¨ª hay paquetes permitidos, pero todos est¨¢n vencidos
                        if (!$paquete_valido && $paquete_vencido) {
                            echo json_encode(['status' => false, 'msg' => 'Tu paquete ha vencido para la fecha seleccionada']);
                            
                            $conn->close();
                            exit();
                        }
                    
                        // Si hay un paquete v¨¢lido, el flujo contin¨²a y no mostramos mensaje de error
                    }

            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            // 7. Intentar descontar sesiÃ³n 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'
                ");
            }
            
            // 8. Registrar reserva en socio_clase
            $queryInsert = "
                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($queryInsert) !== TRUE) {
                echo json_encode(['status' => false, 'msg' => 'Error al registrar la clase.']);
                exit;
            }
            
            // 9. Actualizar clientes registrados en fecha_clase
            
            $query_buscar = "
                SELECT COUNT(id_fecha_clase) AS total
                FROM fecha_clase
                WHERE clase_idClase = '$obj->idClase'
                  AND fecha_de_clase = '$obj->fechaClase'
            ";
            
            $result = $conn->query($query_buscar);
            $row = $result->fetch_assoc();
            $total = $row['total'];
            
            
            if ($total >= 1) {
                $queryFecha = "
                    UPDATE fecha_clase
                    SET clientes_registrados = clientes_registrados + 1
                    WHERE clase_idClase = '$obj->idClase'
                      AND fecha_de_clase = '$obj->fechaClase'
                ";
            } else {
                
                $queryFecha = "
                    INSERT INTO fecha_clase (clase_idClase, clientes_registrados, fecha_de_clase)
                    VALUES ('$obj->idClase', 1, '$obj->fechaClase')
                ";
            }
            
            try {
                // Ejecutamos la query final
                if ($conn->query($queryFecha) === true) {
                    $response = [
                        'status' => true,
                        'msg'    => 'Clase reservada correctamente',
                    ];
            
                    if ($idAsistencia !== null) {
                        $response['sesiones_restantes'] = $sesiones_restantes - 1;
                        $response['paquete'] = $nombrePaquete; // Nombre del paquete en lugar del id
                    }
                } else {
                    // Error al ejecutar la query
                    $response = [
                        'status' => false,
                        'msg'    => 'Error al reservar la clase: ' . $conn->error,
                    ];
                }
            } catch (Exception $e) {
                // Error inesperado
                $response = [
                    'status' => false,
                    'msg'    => 'Excepci¨®n: ' . $e->getMessage(),
                ];
            }
            
            // Respuesta final en JSON
            echo json_encode($response);
            $conn->close();
            exit;

            


            break;
            
            case '1':
                $conn = new mysqli("directoriofitness.com.mx", "direct18", "L4LL4v3M@3str@",$obj->bd);
                $id = $obj->idsocioclase;
                if($id == null){
                    echo json_encode([
                                "status" => false,
                                "msg" => "Error al cancelar lugar."
                            ]);
                    exit();
                }
                // Necesitamos saber a qu¨¦ hora es la clase que quiere cancelar
                $queryInfo = "SELECT c.HoraEntrada, c.minimo_cancelacion, sc.fecha_de_clase 
                              FROM socio_clase sc 
                              INNER JOIN clase c ON sc.Clase_idClase = c.idClase 
                              WHERE sc.idSocio_Clase = '$obj->idsocioclase' LIMIT 1";
                
                $resInfo = $conn->query($queryInfo);
                if($resInfo->num_rows > 0) {
                    $data = $resInfo->fetch_assoc();
                    
                    $timestampClase = strtotime($data['fecha_de_clase'] . " " . $data['HoraEntrada']);
                    $minutosCancelacion = (int)$data['minimo_cancelacion'];
                    
                    // L¨ªmite: Si la clase es a las 10:00 y el m¨ªnimo son 60 min, debe cancelar antes de las 09:00
                    $timestampLimiteCancelacion = strtotime("-$minutosCancelacion minutes", $timestampClase);
                    $ahora = time();
            
                    if ($ahora > $timestampLimiteCancelacion) {
                        echo json_encode(['status' => false, 'msg' => "No puedes cancelar. El tiempo l¨ªmite era $minutosCancelacion min antes."]);
                        exit();
                    }
                }
                // 1. Restar un cliente de fecha_clase
                $query = "UPDATE fecha_clase SET fecha_clase.clientes_registrados = fecha_clase.clientes_registrados - 1 WHERE fecha_clase.id_fecha_clase = '$obj->idfechaclase'";
                if($conn->query($query) == TRUE){
                     // 2. Obtener datos del socio_clase (Socio_idSocio y paqueteAsignado)
                     $queryGet = "SELECT Socios_idSocio, paqueteAsignado 
                                 FROM socio_clase 
                                 WHERE idSocio_Clase = '$id' 
                                 LIMIT 1";
                
                    $resGet = $conn->query($queryGet);
                    $Socio_idSocio = null;
                    $paqueteAsignado = null;
                
                    if($resGet && $resGet->num_rows > 0){
                        $row = $resGet->fetch_assoc();
                        $Socio_idSocio = $row['Socios_idSocio'];
                        $paqueteAsignado = $row['paqueteAsignado'];
                    }
                    
                    // 3. Cancelar socio_clase
                    $query_socio = "UPDATE socio_clase SET socio_clase.status = '2' WHERE socio_clase.idSocio_Clase = '$obj->idsocioclase'";
                    
                    
                    
                    // 4. Intentar devolver sesi¨®n (si el paquete aplica)
                    $sesiones_restantes = null;
                    $nombrePaquete = null;
            
                    $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 = '$Socio_idSocio'
                          AND aps.paq_idPaquete = '$paqueteAsignado'
                          AND s.ConSesion = 1
                          AND s.t_sesion = 2
                        ORDER BY aps.fecha_registro DESC
                        LIMIT 1
                    ");
            
                    if ($rowSesion = mysqli_fetch_assoc($consultaSesion)) {
                        $idAsistencia = $rowSesion['id_asistencia_s'];
                        $sesiones_restantes = intval($rowSesion['ses_restantes']);
                        $nombrePaquete = $rowSesion['NombreServicio'];
            
                        // Devolver la sesi¨®n (+1)
                        mysqli_query($conn, "
                            UPDATE asistencia_por_sesiones
                            SET ses_restantes = ses_restantes + 1
                            WHERE id_asistencia_s = '$idAsistencia'
                        ");
            
                        $sesiones_restantes++;
                    }
                    
                    
                    
                    if($conn->query($query_socio) == TRUE){
                        $queryu = "UPDATE reservar_lugar SET cancelado = '1' WHERE id_socioclase = '$obj->idsocioclase'";
                        if ($conn->query($queryu) == TRUE) {
                            echo json_encode([
                                "status" => true,
                                "msg" => "Clase cancelada correctamente",
                                "paquete" => $nombrePaquete,
                                "sesiones_restantes" => $sesiones_restantes
                            ]);
                        } else {
                            echo json_encode([
                                "status" => false,
                                "msg" => "Error al cancelar lugar"
                            ]);
                        }
                    } else {
                        echo json_encode([
                            "status" => false,
                            "msg" => "Error al cancelar socio clase"
                        ]);
                    }
                } else {
                    echo json_encode([
                        "status" => false,
                        "msg" => "Error al actualizar fecha clase"
                    ]);
                }
            
                $conn->close();
                break;
    }
    ?>