<?php
// modules/coordinador/accion_ficha_ppp.php
// Maneja: enviar ficha al estudiante, subir firmada est, subir firmada final
require_once __DIR__ . '/../../config/app.php';
require_once __DIR__ . '/../../config/onedrive.php';
require_once __DIR__ . '/../../includes/OneDriveStorage.php';
require_once __DIR__ . '/../../includes/auth.php';
require_once __DIR__ . '/../../includes/functions.php';
require_once __DIR__ . '/../../includes/flash.php';

$user   = currentUser();
$db     = getDB();
$accion = $_POST['accion']      ?? '';
$idPrac = (int)($_POST['id_practica'] ?? 0);

// ── FIX: cubrir ambas claves posibles del id y del rol ─────────────────────
$idUsuario = $user['id_usuario'] ?? $user['id'] ?? 0;
$rol       = $user['rol']        ?? $user['role'] ?? '';

$esCoord = in_array($rol, [ROL_COORDINADOR, ROL_ADMIN, ROL_SECRETARIA]);
$esEst   = ($rol === ROL_ESTUDIANTE);

if (!$idPrac) {
    header('Location: fichas_ppp.php');
    exit;
}

// Verificar que la práctica existe
$stP = $db->prepare("SELECT id_practica, id_estudiante, ficha_estado FROM practicas WHERE id_practica = :id");
$stP->execute([':id' => $idPrac]);
$prac = $stP->fetch();
if (!$prac) {
    header('Location: fichas_ppp.php');
    exit;
}

// Directorio uploads

// ══ ACCIÓN: Coordinador envía ficha al estudiante ═══════════════════════════
if ($accion === 'enviar' && $esCoord) {
    $db->prepare("
        UPDATE practicas
        SET    ficha_estado = 'enviada', ficha_enviada_at = NOW()
        WHERE  id_practica = :id
    ")->execute([':id' => $idPrac]);

    flashSet('ok', '✅ Ficha habilitada. El estudiante ya puede descargarla y firmarla.');
    header('Location: fichas_ppp.php');
    exit;
}

// ══ ACCIÓN: Estudiante sube ficha firmada por él ════════════════════════════
if ($accion === 'upload_est' && $esEst) {

    // Verificar que la práctica pertenece a este estudiante
    $stEst = $db->prepare("SELECT id_estudiante FROM estudiantes WHERE id_usuario = :u LIMIT 1");
    $stEst->execute([':u' => $idUsuario]);
    $estRow = $stEst->fetch();

    if (!$estRow || (int)$estRow['id_estudiante'] !== (int)$prac['id_estudiante']) {
        flashSet('err', '❌ No tienes permiso para esta acción.');
        header('Location: mi_ficha_ppp.php');
        exit;
    }

    // ── FIX: permitir subir tanto en 'enviada' como en 'firmada_est' (reemplazo) ──
    if (!in_array($prac['ficha_estado'], ['enviada', 'firmada_est'])) {
        flashSet('err', '❌ La ficha no está disponible para subir en este momento.');
        header('Location: mi_ficha_ppp.php');
        exit;
    }

    if (isset($_FILES['ficha_firmada']) && $_FILES['ficha_firmada']['error'] === UPLOAD_ERR_OK) {
        $ext = strtolower(pathinfo($_FILES['ficha_firmada']['name'], PATHINFO_EXTENSION));
        if (!in_array($ext, ['pdf', 'jpg', 'jpeg', 'png'])) {
            flashSet('err', '❌ Solo se permiten archivos PDF, JPG o PNG.');
            header('Location: mi_ficha_ppp.php');
            exit;
        }
        $nombre  = 'ficha_est_' . $idPrac . '_' . time() . '.' . $ext;
        try {
            $rutaOD = OneDriveStorage::upload($_FILES['ficha_firmada']['tmp_name'], 'fichas_ppp', $nombre, (string)$idPrac, (int)($user['id_instituto'] ?? 0));
            $db->prepare("
                UPDATE practicas
                SET    ficha_estado   = 'firmada_est',
                       ficha_doc_est  = :doc
                WHERE  id_practica    = :id
            ")->execute([':doc' => $rutaOD, ':id' => $idPrac]);

            flashSet('ok', '✅ Ficha firmada subida correctamente. El coordinador la revisará y firmará.');
        } catch(Exception $e) {
            flashSet('err', '❌ Error OneDrive: '.$e->getMessage());
        }
    } else {
        $errCodes = [
            UPLOAD_ERR_INI_SIZE   => 'El archivo supera upload_max_filesize en php.ini',
            UPLOAD_ERR_FORM_SIZE  => 'El archivo supera MAX_FILE_SIZE del formulario',
            UPLOAD_ERR_PARTIAL    => 'El archivo se subió parcialmente',
            UPLOAD_ERR_NO_FILE    => 'No se seleccionó ningún archivo',
            UPLOAD_ERR_NO_TMP_DIR => 'Falta la carpeta temporal',
            UPLOAD_ERR_CANT_WRITE => 'No se pudo escribir en disco',
        ];
        $code = $_FILES['ficha_firmada']['error'] ?? UPLOAD_ERR_NO_FILE;
        flashSet('err', '❌ ' . ($errCodes[$code] ?? 'Error al subir el archivo (código ' . $code . ')'));
    }

    header('Location: mi_ficha_ppp.php');
    exit;
}

// ══ ACCIÓN: Coordinador sube ficha firmada final ════════════════════════════
if ($accion === 'upload_final' && $esCoord) {

    // ── FIX: incluir firmada_final para permitir actualizar ─────────────────
    if (!in_array($prac['ficha_estado'], ['firmada_est', 'enviada', 'firmada_final'])) {
        flashSet('err', '❌ Estado incorrecto para subir la firma final.');
        header('Location: fichas_ppp.php');
        exit;
    }

    if (isset($_FILES['ficha_final']) && $_FILES['ficha_final']['error'] === UPLOAD_ERR_OK) {
        $ext = strtolower(pathinfo($_FILES['ficha_final']['name'], PATHINFO_EXTENSION));
        if (!in_array($ext, ['pdf', 'jpg', 'jpeg', 'png'])) {
            flashSet('err', '❌ Solo se permiten archivos PDF, JPG o PNG.');
            header('Location: fichas_ppp.php');
            exit;
        }
        $nombre  = 'ficha_final_' . $idPrac . '_' . time() . '.' . $ext;
        try {
            $rutaOD = OneDriveStorage::upload($_FILES['ficha_final']['tmp_name'], 'fichas_ppp', $nombre, (string)$idPrac, (int)($user['id_instituto'] ?? 0));
            $db->prepare("
                UPDATE practicas
                SET    ficha_estado    = 'firmada_final',
                       ficha_doc_final = :doc
                WHERE  id_practica     = :id
            ")->execute([':doc' => $rutaOD, ':id' => $idPrac]);

            flashSet('ok', '✅ Ficha firmada final subida. El estudiante ya puede verla y descargarla.');
        } catch(Exception $e) {
            flashSet('err', '❌ Error OneDrive: '.$e->getMessage());
        }
    } else {
        flashSet('err', '❌ Selecciona un archivo para subir.');
    }

    header('Location: fichas_ppp.php');
    exit;
}

// ══ Ninguna acción coincidió ════════════════════════════════════════════════
// DEBUG TEMPORAL: descomenta para ver qué rol/acción llega
// die(json_encode(['accion'=>$accion,'rol'=>$rol,'esCoord'=>$esCoord,'esEst'=>$esEst,'user'=>$user]));

flashSet('err', '❌ Acción no válida o sin permisos suficientes.');
header('Location: fichas_ppp.php');
exit;