<?php
// api/subir_doc_ppp.php — MODIFICADO PARA ONEDRIVE
require_once __DIR__ . '/../config/app.php';
require_once __DIR__ . '/../config/onedrive.php';
require_once __DIR__ . '/../includes/auth.php';
require_once __DIR__ . '/../includes/functions.php';
require_once __DIR__ . '/../includes/OneDriveStorage.php';
requireRol(ROL_ESTUDIANTE);

header('Content-Type: application/json; charset=utf-8');

function fail(string $msg, int $code = 400): void {
    http_response_code($code);
    echo json_encode(['ok' => false, 'error' => $msg]);
    exit;
}
function ok(array $data = []): void {
    echo json_encode(array_merge(['ok' => true], $data));
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') fail('Método no permitido.', 405);

$codigoDoc  = trim($_POST['codigo_doc']  ?? '');
$idPractica = (int)($_POST['id_practica'] ?? 0);

$VALIDOS = ['001','002','003','004','002A','005','008','009','010','011','012'];
if (!in_array($codigoDoc, $VALIDOS)) fail('Código de documento inválido.');
if ($idPractica <= 0)                fail('Práctica inválida.');

$user = currentUser();
$db   = getDB();

$stCheck = $db->prepare("
    SELECT p.id_practica, u.cedula, u.nombres, u.apellidos
    FROM   practicas p
    JOIN   estudiantes e ON e.id_estudiante = p.id_estudiante
    JOIN   usuarios u    ON u.id_usuario    = e.id_usuario
    WHERE  p.id_practica = :ip AND e.id_usuario = :uid
      AND  p.estado NOT IN ('borrador','rechazado')
    LIMIT 1
");
$stCheck->execute([':ip' => $idPractica, ':uid' => $user['id']]);
$prac = $stCheck->fetch();
if (!$prac) fail('No tienes acceso a esta práctica.', 403);

$stEst = $db->prepare("SELECT estado FROM documentos_ppp_gestion WHERE id_practica=:ip AND codigo_doc=:cod LIMIT 1");
$stEst->execute([':ip' => $idPractica, ':cod' => $codigoDoc]);
$docActual = $stEst->fetch();
if ($docActual && $docActual['estado'] === 'aprobado') {
    fail('Este documento ya fue aprobado por el coordinador.');
}

// ── Validar archivo ───────────────────────────────────────────────
if (!isset($_FILES['archivo']) || $_FILES['archivo']['error'] !== UPLOAD_ERR_OK) {
    fail('Error al recibir el archivo.');
}

$file     = $_FILES['archivo'];
$mimeReal = mime_content_type($file['tmp_name']);
if (!in_array($mimeReal, ['application/pdf', 'application/x-pdf'])) {
    fail('El archivo debe ser PDF.');
}
if ($file['size'] > 15 * 1024 * 1024) {
    fail('El archivo supera el límite de 15 MB.');
}

// ── Subir a OneDrive ──────────────────────────────────────────────
$nombreFinal = "PPP-{$codigoDoc}-{$prac['cedula']}-{$idPractica}.pdf";

try {
    // Sube a SIGVP-Uploads/documentos_ppp/{id_practica}/PPP-001-xxx.pdf
    $instIdPpp = (int)($user['id_instituto'] ?? 0);
    $rutaRelativa = OneDriveStorage::upload(
        $file['tmp_name'],
        'documentos_ppp',
        $nombreFinal,
        (string)$idPractica,
        $instIdPpp
    );
} catch (Exception $e) {
    fail('Error al subir el archivo a OneDrive: ' . $e->getMessage(), 500);
}

// ── Guardar en BD ─────────────────────────────────────────────────
// $rutaRelativa queda como: "onedrive:documentos_ppp/5/PPP-001-..."
$stUpsert = $db->prepare("
    INSERT INTO documentos_ppp_gestion
        (id_practica, codigo_doc, nombre_archivo, ruta_archivo, tamano_bytes, estado, subido_por, subido_at)
    VALUES
        (:ip, :cod, :nom, :ruta, :tam, 'enviado', :uid, NOW())
    ON DUPLICATE KEY UPDATE
        nombre_archivo = VALUES(nombre_archivo),
        ruta_archivo   = VALUES(ruta_archivo),
        tamano_bytes   = VALUES(tamano_bytes),
        estado         = 'enviado',
        observacion    = NULL,
        subido_por     = VALUES(subido_por),
        subido_at      = NOW(),
        aprobado_por   = NULL,
        aprobado_at    = NULL,
        updated_at     = NOW()
");
$stUpsert->execute([
    ':ip'   => $idPractica,
    ':cod'  => $codigoDoc,
    ':nom'  => $nombreFinal,
    ':ruta' => $rutaRelativa,
    ':tam'  => $file['size'],
    ':uid'  => $user['id'],
]);

ok(['mensaje' => "PPP-{$codigoDoc} enviado al coordinador."]);
