<?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
            $facultad_id = $user->facultad['facultad_id'] ?? -1;
            $puestos = array_map(
                fn($p) => array(
                    ...$p,
                    'materias' => $db->where('puesto_id', $p['puesto_id'])
                        ->join('puesto_materia', 'puesto_materia.materia_id = materia.materia_id', 'LEFT')
                        ->get(tableName: 'materia', columns: ['materia.materia_id', 'materia_nombre', 'clave_materia',]),
                    'encargado' => $db->where('puesto_id', $p['puesto_id'])
                        ->join('puesto_usuario', 'puesto_usuario.usuario_id = usuario.usuario_id', 'LEFT')
                        ->getOne('usuario', ['usuario.usuario_id', 'usuario_nombre', 'usuario_clave']),
                ),
                $db->orderBy('puesto.nombre', 'desc')
                    ->where('facultad_id', $facultad_id)
                    ->get(tableName: 'puesto', columns: 'puesto_id, nombre'),
            );
            echo json_encode($puestos);
            break;

        case 'POST':
            $raw_input = file_get_contents('php://input');
            $input_data = json_decode($raw_input, true);

            if (!$input_data || !isset($input_data['puesto_nombre'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Datos inválidos']);
                exit();
            }

            $puesto = $db->insert('puesto', [
                'nombre' => $input_data['puesto_nombre'],
                'facultad_id' => $user->facultad['facultad_id'],
            ], ['puesto_id', 'nombre', 'facultad_id']);

            echo json_encode(
                array(
                    ...$puesto,
                    'materias' => [],
                    'encargado' => null,
                ),
            );
            break;

        case 'PUT':
            $raw_input = file_get_contents('php://input');
            $input_data = json_decode($raw_input, true);

            if (!$input_data || !isset($input_data['puesto_id'], $input_data['materias'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Datos inválidos']);
                exit();
            }

            $db->where('puesto_id', $input_data['puesto_id'])->delete('puesto_materia');
            $db->where('puesto_id', $input_data['puesto_id'])->delete('puesto_usuario');

            foreach ($input_data['materias'] as $materia_id) {
                $db->insert('puesto_materia', [
                    'puesto_id' => $input_data['puesto_id'],
                    'materia_id' => $materia_id,
                ]);
            }

            if (isset($input_data['usuario_id']))
                $db->insert('puesto_usuario', [
                    'puesto_id' => $input_data['puesto_id'],
                    'usuario_id' => $input_data['usuario_id'],
                ]);

            echo json_encode(['msg' => 'Puesto actualizado exitosamente']);
            break;

        case 'DELETE':
            $raw_input = file_get_contents('php://input');
            $input_data = json_decode($raw_input, true);

            if (!$input_data || !isset($input_data['puesto_id'])) {
                header('HTTP/1.1 400 Bad Request');
                echo json_encode(['error' => 'Datos inválidos']);
                exit();
            }

            $db->where('puesto_id', $input_data['puesto_id'])->delete('puesto');
            echo json_encode(['msg' => 'Puesto eliminado exitosamente']);
            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()
    ]);
}