<?php
// Requiere archivo de conexión a la base de datos
require_once __DIR__ . '/../config/database.php';

header('Content-Type: application/json');

// Validar método POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['success' => false, 'message' => 'Método no permitido']);
    exit;
}
 
// Recibir y validar datos

$curp = isset($_POST['curp']) ? trim($_POST['curp']) : null;
$id_quincena = isset($_POST['id_quincena']) ? intval($_POST['id_quincena']) : null;
$tipo_periodo = isset($_POST['tipo_periodo']) ? $_POST['tipo_periodo'] : 'quincenal';
$horarios = isset($_POST['horarios']) ? json_decode($_POST['horarios'], true) : null;
$descansos = isset($_POST['descansos']) ? json_decode($_POST['descansos'], true) : [];
$fecha_inicio_asignacion = isset($_POST['fecha_inicio_asignacion']) ? trim($_POST['fecha_inicio_asignacion']) : null;

// Log de depuración para ver los datos recibidos (después de definir variables)
file_put_contents(__DIR__ . '/debug_post.log',
    date('Y-m-d H:i:s') . "\n" .
    'POST: ' . print_r($_POST, true) . "\n" .
    'curp: ' . var_export($curp, true) . "\n" .
    'id_quincena: ' . var_export($id_quincena, true) . "\n" .
    'tipo_periodo: ' . var_export($tipo_periodo, true) . "\n" .
    'horarios: ' . var_export($horarios, true) . "\n" .
    'descansos: ' . var_export($descansos, true) . "\n" .
    'fecha_inicio_asignacion: ' . var_export($fecha_inicio_asignacion, true) . "\n\n",
    FILE_APPEND
);


try {
    $db = new Database();
    $conn = $db->connect();

    // 1. Validar existencia de CURP en Plantilla
    $stmt = $conn->prepare('SELECT CURP FROM Plantilla WHERE CURP = ?');
    $stmt->execute([$curp]);
    if ($stmt->rowCount() === 0) {
        exit;
    }

    // 2. Validar existencia de id_quincena en Quincenas
    $stmt = $conn->prepare('SELECT id_quincena FROM Quincenas WHERE id_quincena = ?');
    $stmt->execute([$id_quincena]);
    if ($stmt->rowCount() === 0) {
        echo json_encode(['success' => false, 'message' => 'La quincena seleccionada no existe']);
        exit;
    }
 

    // 3. Obtener fechas del periodo a asignar
    $stmtQ = $conn->prepare('SELECT fecha_inicio, fecha_fin FROM Quincenas WHERE id_quincena = ?');
    $stmtQ->execute([$id_quincena]);
    $q = $stmtQ->fetch(PDO::FETCH_ASSOC);
    $fecha_inicio = $q['fecha_inicio'];
    $fecha_fin = $q['fecha_fin'];

    // Buscar si ya existe un HorariosAsignados para este curp y quincena
    $stmt = $conn->prepare('SELECT id_horario FROM HorariosAsignados WHERE curp = ? AND id_quincena = ?');
    $stmt->execute([$curp, $id_quincena]);
    $id_horario_existente = $stmt->fetchColumn();

    if ($id_horario_existente) {
        // Ya existe un registro para este periodo, no modificar ni eliminar nada
        echo json_encode([
            'success' => false,
            'message' => 'Ya existe un horario para este colaborador y quincena. No se realizaron cambios.'
        ]);
        exit;
    }

    // 4. Insertar nuevo HorariosAsignados (solo si no existe)
    $stmt = $conn->prepare('INSERT INTO HorariosAsignados (curp, id_quincena, fecha_inicio, fecha_fin) VALUES (?, ?, ?, ?)');
    $stmt->execute([$curp, $id_quincena, $fecha_inicio, $fecha_fin]);
    $id_horario = $conn->lastInsertId();

    // 5. Insertar detalle por cada día y semana según tipo_periodo
    $dias_validos = ['Lunes','Martes','Miércoles','Jueves','Viernes','Sábado','Domingo'];
    // Usar INSERT ... ON DUPLICATE KEY UPDATE para DetalleHorariosSemana
    $stmt = $conn->prepare('INSERT INTO DetalleHorariosSemana (id_horario, semana, dia_semana, fecha, hora_entrada, hora_salida) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE hora_entrada=VALUES(hora_entrada), hora_salida=VALUES(hora_salida), fecha=VALUES(fecha)');
    $errores_detalle = [];
    if ($tipo_periodo === 'quincenal') {
        // Si es quincenal, replicar el mismo horario para las 3 semanas
        if (isset($horarios['quincenal']) && is_array($horarios['quincenal'])) {
            for ($semana = 1; $semana <= 3; $semana++) {
                foreach ($dias_validos as $dia) {
                    $entrada = isset($horarios['quincenal'][$dia]['entrada']) ? $horarios['quincenal'][$dia]['entrada'] : null;
                    $salida = isset($horarios['quincenal'][$dia]['salida']) ? $horarios['quincenal'][$dia]['salida'] : null;
                    $fecha = isset($horarios['quincenal'][$dia]['fecha']) ? $horarios['quincenal'][$dia]['fecha'] : null;
                    
                    // VALIDACIÓN: Solo insertar si tiene fecha válida
                    // Se permite 00:00 para días de descanso (tienen fecha pero no horario)
                    if (!$fecha) {
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " QUINCENA SEMANA $semana - $dia: OMITIDO (sin fecha)\n", FILE_APPEND);
                        continue; // No insertar días sin fecha
                    }

                    if ($fecha_inicio_asignacion && $fecha < $fecha_inicio_asignacion) {
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " QUINCENA SEMANA $semana - $dia: OMITIDO (fecha antes de inicio)\n", FILE_APPEND);
                        continue;
                    }
                    
                    // Convertir valores vacíos o null a '00:00' para días de descanso
                    if (empty($entrada)) $entrada = '00:00';
                    if (empty($salida)) $salida = '00:00';
                    
                    try {
                        $stmt->execute([$id_horario, $semana, $dia, $fecha, $entrada, $salida]);
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " QUINCENA SEMANA $semana - $dia: entrada=$entrada, salida=$salida, fecha=$fecha, id_horario=$id_horario\n", FILE_APPEND);
                    } catch (Exception $ex) {
                        $errores_detalle[] = "Error insertando $dia semana $semana: " . $ex->getMessage();
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " ERROR QUINCENA SEMANA $semana - $dia: " . $ex->getMessage() . "\n", FILE_APPEND);
                    }
                }
            }
        } else {
            file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " [ERROR] No se recibió estructura válida para horarios[quincenal]: " . var_export($horarios, true) . "\n", FILE_APPEND);
        }
    } else {
        // Si es semanal, cada semana puede tener su propio horario
        for ($semana = 1; $semana <= 3; $semana++) {
            $key = 'semana' . $semana;
            if (isset($horarios[$key]) && is_array($horarios[$key])) {
                foreach ($dias_validos as $dia) {
                    $entrada = isset($horarios[$key][$dia]['entrada']) ? $horarios[$key][$dia]['entrada'] : null;
                    $salida = isset($horarios[$key][$dia]['salida']) ? $horarios[$key][$dia]['salida'] : null;
                    $fecha = isset($horarios[$key][$dia]['fecha']) ? $horarios[$key][$dia]['fecha'] : null;
                    
                    // VALIDACIÓN: Solo insertar si tiene fecha válida
                    // Se permite 00:00 para días de descanso (tienen fecha pero no horario)
                    if (!$fecha) {
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " SEMANA $semana - $dia: OMITIDO (sin fecha)\n", FILE_APPEND);
                        continue; // No insertar días sin fecha
                    }

                    if ($fecha_inicio_asignacion && $fecha < $fecha_inicio_asignacion) {
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " SEMANA $semana - $dia: OMITIDO (fecha antes de inicio)\n", FILE_APPEND);
                        continue;
                    }
                    
                    // Convertir valores vacíos o null a '00:00' para días de descanso
                    if (empty($entrada)) $entrada = '00:00';
                    if (empty($salida)) $salida = '00:00';
                    
                    try {
                        $stmt->execute([$id_horario, $semana, $dia, $fecha, $entrada, $salida]);
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " SEMANA $semana - $dia: entrada=$entrada, salida=$salida, fecha=$fecha, id_horario=$id_horario\n", FILE_APPEND);
                    } catch (Exception $ex) {
                        $errores_detalle[] = "Error insertando $dia semana $semana: " . $ex->getMessage();
                        file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " ERROR SEMANA $semana - $dia: " . $ex->getMessage() . "\n", FILE_APPEND);
                    }
                }
            } else {
                file_put_contents(__DIR__ . '/debug_detalle_horarios.log', date('Y-m-d H:i:s') . " [ERROR] No se recibió estructura válida para horarios[$key]: " . var_export($horarios, true) . "\n", FILE_APPEND);
            }
        }
    }

    // 6. Insertar días de descanso por semana (si existen)
    if (is_array($descansos) && count($descansos) > 0) {
        // Usar INSERT ... ON DUPLICATE KEY UPDATE para DiasDescanso
        $stmtDescanso = $conn->prepare('INSERT INTO DiasDescanso (id_horario, id_quincena, dia_semana, fecha_descanso) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE fecha_descanso=VALUES(fecha_descanso)');
        foreach ($descansos as $descanso) {
            if (!$descanso) continue;
            $partes = explode('|', $descanso);
            $dia_semana = isset($partes[0]) ? $partes[0] : null;
            $fecha_descanso = isset($partes[1]) ? $partes[1] : null;
            if ($dia_semana && $fecha_descanso) {
                if ($fecha_inicio_asignacion && $fecha_descanso < $fecha_inicio_asignacion) {
                    continue;
                }
                $stmtDescanso->execute([$id_horario, $id_quincena, $dia_semana, $fecha_descanso]);
            }
        }
    }

    echo json_encode([
        'success' => true,
        'message' => 'Horario semanal asignado correctamente',
        'id_horario' => $id_horario,
        'errores_detalle' => $errores_detalle
    ]);
} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => 'Error: ' . $e->getMessage()]);
}
