<?php
// Actualizar horario semanal con UPDATE por id_detalle (sin borrar)
require_once __DIR__ . '/../config/database.php';
header('Content-Type: application/json');

try {
    $db = new Database();
    $conn = $db->connect();
    
    // Recibir datos
    $curp = $_POST['curp'] ?? null;
    $id_quincena = $_POST['id_quincena'] ?? null;
    $horarios_json = $_POST['horarios'] ?? null;
    $descansos_json = $_POST['descansos'] ?? null;
    
    // LOG: Depuración de datos recibidos
    error_log("DEBUG new_update_horario_semanal.php - POST recibido: " . print_r($_POST, true));
    error_log("DEBUG curp: $curp, id_quincena: $id_quincena");
    error_log("DEBUG horarios_json: $horarios_json");
    error_log("DEBUG descansos_json: $descansos_json");
    
    if (!$curp || !$id_quincena || !$horarios_json) {
        echo json_encode([
            'success' => false, 
            'message' => 'Faltan datos requeridos',
            'debug' => [
                'curp' => $curp,
                'id_quincena' => $id_quincena,
                'horarios_json' => $horarios_json ? 'presente' : 'ausente',
                'descansos_json' => $descansos_json ? 'presente' : 'ausente'
            ]
        ]);
        exit;
    }
    
    $horarios = json_decode($horarios_json, true);
    $descansos = json_decode($descansos_json, true);
    
    // Verificar que existe el horario asignado
    $stmt = $conn->prepare('SELECT id_horario FROM HorariosAsignados WHERE curp = ? AND id_quincena = ?');
    $stmt->execute([$curp, $id_quincena]);
    $horarioAsignado = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$horarioAsignado) {
        echo json_encode(['success' => false, 'message' => 'No existe horario asignado para este colaborador y periodo']);
        exit;
    }
    
    $id_horario = $horarioAsignado['id_horario'];
    
    // Iniciar transacción
    $conn->beginTransaction();
    
    try {
        // PASO 1: Actualizar DetalleHorariosSemana
        // Recibimos array con {id_detalle, semana, dia, entrada, salida, fecha}
        foreach ($horarios as $horarioData) {
            $id_detalle = $horarioData['id_detalle'] ?? null;
            $semana = $horarioData['semana'] ?? null;
            $dia_semana = $horarioData['dia_semana'] ?? null;
            $hora_entrada = $horarioData['hora_entrada'] ?? '00:00:00';
            $hora_salida = $horarioData['hora_salida'] ?? '00:00:00';
            $fecha = $horarioData['fecha'] ?? null;
            
            // Asegurar formato HH:MM:SS
            if (strlen($hora_entrada) === 5) $hora_entrada .= ':00';
            if (strlen($hora_salida) === 5) $hora_salida .= ':00';
            
            if ($id_detalle) {
                // UPDATE: Ya existe el registro
                $stmtUpdate = $conn->prepare('
                    UPDATE DetalleHorariosSemana 
                    SET hora_entrada = ?, hora_salida = ?, fecha = ?
                    WHERE id_detalle = ? AND id_horario = ?
                ');
                $stmtUpdate->execute([$hora_entrada, $hora_salida, $fecha, $id_detalle, $id_horario]);
            } else {
                // INSERT: Nuevo día agregado
                $stmtInsert = $conn->prepare('
                    INSERT INTO DetalleHorariosSemana (id_horario, semana, dia_semana, hora_entrada, hora_salida, fecha)
                    VALUES (?, ?, ?, ?, ?, ?)
                ');
                $stmtInsert->execute([$id_horario, $semana, $dia_semana, $hora_entrada, $hora_salida, $fecha]);
            }
        }
        
        // PASO 2: Actualizar DiasDescanso
        // Primero, obtener descansos actuales con id_descanso
        $stmtDescansos = $conn->prepare('SELECT id_descanso, fecha_descanso FROM DiasDescanso WHERE id_horario = ?');
        $stmtDescansos->execute([$id_horario]);
        $descansosActuales = $stmtDescansos->fetchAll(PDO::FETCH_ASSOC);
        
        // Crear mapa de fecha => id_descanso
        $mapaDescansos = [];
        foreach ($descansosActuales as $desc) {
            $mapaDescansos[$desc['fecha_descanso']] = $desc['id_descanso'];
        }
        
        // Procesar nuevos descansos
        $fechasDescansosNuevos = [];
        foreach ($descansos as $descanso) {
            $id_descanso = $descanso['id_descanso'] ?? null;
            $fecha_descanso = $descanso['fecha_descanso'] ?? null;
            $dia_semana = $descanso['dia_semana'] ?? null;
            $semana = $descanso['semana'] ?? null;
            
            if (!$fecha_descanso) continue;
            
            $fechasDescansosNuevos[] = $fecha_descanso;
            
            if (isset($mapaDescansos[$fecha_descanso])) {
                // Ya existe, solo actualizar dia_semana si es necesario
                $stmtUpdateDesc = $conn->prepare('
                    UPDATE DiasDescanso 
                    SET dia_semana = ?
                    WHERE id_descanso = ?
                ');
                $stmtUpdateDesc->execute([$dia_semana, $mapaDescansos[$fecha_descanso]]);
            } else {
                // Nuevo descanso, insertar CON id_quincena (requerido por FK)
                $stmtInsertDesc = $conn->prepare('
                    INSERT INTO DiasDescanso (id_horario, id_quincena, dia_semana, fecha_descanso)
                    VALUES (?, ?, ?, ?)
                ');
                $stmtInsertDesc->execute([$id_horario, $id_quincena, $dia_semana, $fecha_descanso]);
            }
        }
        
        // PASO 3: Eliminar descansos que ya no están en la lista
        foreach ($mapaDescansos as $fecha => $id_desc) {
            if (!in_array($fecha, $fechasDescansosNuevos)) {
                $stmtDeleteDesc = $conn->prepare('DELETE FROM DiasDescanso WHERE id_descanso = ?');
                $stmtDeleteDesc->execute([$id_desc]);
            }
        }
        
        $conn->commit();
        echo json_encode(['success' => true, 'message' => 'Horario actualizado correctamente']);
        
    } catch (Exception $e) {
        $conn->rollBack();
        echo json_encode(['success' => false, 'message' => 'Error en transacción: ' . $e->getMessage()]);
    }
    
} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
