<?php
require_once "{$_SERVER['DOCUMENT_ROOT']}/class/c_login.php";
header('Content-Type: application/json');

if (!Login::is_logged()) {
    header('HTTP/1.1 401 Unauthorized');
    echo json_encode(['error' => 'No se ha iniciado sesión']);
    exit();
}
$user = Login::get_user();

try {
    switch ($_SERVER['REQUEST_METHOD']) {
        case 'GET':
            // Fetch all puestos
            $periodo_id = $user->periodo_id;
            if (is_null($user->facultad['facultad_id'])) {
                $periodos = $db
                    //->where('CURRENT_DATE BETWEEN periodo_fecha_inicio AND periodo_fecha_fin')
                    ->join('nivel', 'nivel.nivel_id = periodo.nivel_id')
                    ->orderBy('periodo_id')
                    ->get('periodo', null, 'periodo.*, nivel_nombre as nivel');
            } else {
                $periodos = $db->query(
                    "SELECT DISTINCT periodo.*, nivel_nombre as nivel FROM periodo
                    JOIN horario_view USING (periodo_id)
                    JOIN nivel ON nivel.nivel_id = periodo.nivel_id
                    WHERE /*CURRENT_DATE BETWEEN periodo.periodo_fecha_inicio AND periodo.periodo_fecha_fin
                    AND */facultad_id = :facultad_id
                    ORDER BY periodo_id
                    ",
                    ['facultad_id' => $user->facultad['facultad_id']]
                );
            }
            echo json_encode($periodos);
            break;

        case 'PUT':
            // Update nivel_id of a periodo
            $raw = file_get_contents('php://input');
            $data = json_decode($raw, true);

            if (!isset($data['action'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Falta la acción a realizar']);
                exit();
            }

            switch ($data['action']) {
                case 'changeNivel':
                    if (!isset($data['periodo_id'], $data['nivel_id'])) {
                        header('HTTP/1.1 400 Bad Request');
                        echo json_encode(['error' => 'Falta el id del periodo o el nivel']);
                        exit();
                    }

                    $periodo_id = $data['periodo_id'];
                    $nivel_id = $data['nivel_id'];
                    $db->where('periodo_id', $periodo_id)->update('periodo', ['nivel_id' => $nivel_id]);

                    $periodo_nombre = $db->where('periodo_id', $periodo_id)->getOne('periodo', 'periodo_nombre')['periodo_nombre'];
                    $nivel_nombre = $db->where('nivel_id', $nivel_id)->getOne('nivel', 'nivel_nombre')['nivel_nombre'];

                    echo json_encode([
                        'success' =>
                            "El nivel del periodo $periodo_nombre ha sido cambiado a $nivel_nombre"
                    ]);
                    break;

                case 'changeFechaInicio':
                    if (!isset($data['periodo_id'], $data['periodo_fecha_inicio'])) {
                        header('HTTP/1.1 400 Bad Request');
                        echo json_encode(['error' => 'Falta el id del periodo o la fecha de inicio']);
                        exit();
                    }

                    $periodo_id = $data['periodo_id'];
                    $periodo_fecha_inicio = $data['periodo_fecha_inicio'];
                    $db->where('periodo_id', $periodo_id)->update('periodo', ['periodo_fecha_inicio' => $periodo_fecha_inicio]);

                    $periodo_nombre = $db->where('periodo_id', $periodo_id)->getOne('periodo', 'periodo_nombre')['periodo_nombre'];

                    echo json_encode([
                        'success' =>
                            "La fecha de inicio del periodo $periodo_nombre ha sido cambiada a $periodo_fecha_inicio"
                    ]);
                    break;

                case 'changeFechaFin':
                    if (!isset($data['periodo_id'], $data['periodo_fecha_fin'])) {
                        header('HTTP/1.1 400 Bad Request');
                        echo json_encode(['error' => 'Falta el id del periodo o la fecha de fin']);
                        exit();
                    }

                    $periodo_id = $data['periodo_id'];
                    $periodo_fecha_fin = $data['periodo_fecha_fin'];
                    $db->where('periodo_id', $periodo_id)->update('periodo', ['periodo_fecha_fin' => $periodo_fecha_fin]);

                    $periodo_nombre = $db->where('periodo_id', $periodo_id)->getOne('periodo', 'periodo_nombre')['periodo_nombre'];

                    echo json_encode([
                        'success' =>
                            "La fecha de fin del periodo $periodo_nombre ha sido cambiada a $periodo_fecha_fin"
                    ]);
                    break;

                case 'updatePeriodo':
                    if (!isset($data['periodo_id'], $data['periodo_nombre'], $data['id_periodo_sgu'], $data['periodo_clave'])) {
                        header('HTTP/1.1 400 Bad Request');
                        echo json_encode(['error' => 'Faltan datos para actualizar el periodo']);
                        exit();
                    }

                    $periodo_id = $data['periodo_id'];

                    $db->where('periodo_id', $periodo_id)->update('periodo', array_filter($data, fn($key) => in_array($key, [
                        'periodo_nombre',
                        'id_periodo_sgu',
                        'periodo_clave',
                    ]), ARRAY_FILTER_USE_KEY));

                    $periodo_nombre = $db->where('periodo_id', $periodo_id)->getOne('periodo', 'periodo_nombre')['periodo_nombre'];

                    echo json_encode([
                        'success' =>
                            "El periodo $periodo_nombre ha sido actualizado"
                    ]);
                    break;

                default:
                    header('HTTP/1.1 400 Bad Request');
                    echo json_encode(['error' => 'Acción no válida']);
                    exit();
            }

            break;
        case 'POST':
            $raw = file_get_contents('php://input');
            $data = json_decode($raw, true);

            if (!isset($data['periodo_nombre'], $data['nivel_id'], $data['periodo_fecha_inicio'], $data['periodo_fecha_fin'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Faltan datos para crear el periodo']);
                exit();
            }

            $newPeriodo = $db->insert(
                'periodo',
                array_filter($data, fn($key) => in_array($key, [
                    'periodo_nombre',
                    'nivel_id',
                    'periodo_fecha_inicio',
                    'periodo_fecha_fin',
                    'periodo_clave',
                    'id_periodo_sgu',
                ]), ARRAY_FILTER_USE_KEY)
            );

            echo json_encode([
                'success' => true,
                'message' => 'El periodo ha sido creado',
                'periodo' => $newPeriodo
            ]);
            break;

        case 'DELETE':
            // Delete a periodo
            $raw = file_get_contents('php://input');
            $data = json_decode($raw, true);

            if (!isset($data['periodo_id'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Falta el id del periodo']);
                exit();
            }

            $periodo_id = $data['periodo_id'];
            $periodo_nombre = $db->where('periodo_id', $periodo_id)->getOne('periodo', 'periodo_nombre')['periodo_nombre'];

            $db->where('periodo_id', $periodo_id)->delete('periodo');

            echo json_encode([
                'success' => true,
                'message' => "El periodo $periodo_nombre ha sido eliminado"
            ]);
            break;
        default:
            header('HTTP/1.1 405 Method Not Allowed');
            echo json_encode(['error' => 'Método no permitido']);
            break;
    }
} catch (PDOException $e) {
    echo json_encode([
        'error' => $e->getMessage(),
        'query' => $db->getLastQuery(),
        'exception' => $e->getTraceAsString()
    ]);
} catch (Exception $e) {
    echo json_encode([
        'error' => $e->getMessage(),
        'exception' => $e->getTraceAsString()
    ]);
}