<?php
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';
requireRol(ROL_ESTUDIANTE);
$idInst = instId();

$user      = currentUser();
$db        = getDB();
$pageTitle = 'Mi Práctica';

// ── Datos del estudiante ────────────────────────────────────
$est = $db->prepare("
    SELECT e.*, c.horas_minimas AS carrera_horas_minimas
    FROM estudiantes e
    JOIN carreras c ON c.id_carrera = e.id_carrera
    WHERE e.id_usuario = :u
");
$est->execute([':u' => $user['id']]);
$est = $est->fetch();

// ── Práctica activa ─────────────────────────────────────────
$practica      = null;
$puedePostular = true;
if ($est) {
    $st = $db->prepare("
        SELECT pr.*,
               COALESCE(em.razon_social, pr.emp_nueva_nombre) AS empresa,
               pe.nombre AS periodo,
               CONCAT(ut.nombres,' ',ut.apellidos) AS tutor_nombre,
               ut.email AS tutor_email
        FROM practicas pr
        LEFT JOIN empresas em ON em.id_empresa = pr.id_empresa
        JOIN periodos_academicos pe ON pe.id_periodo = pr.id_periodo
        LEFT JOIN tutores t ON t.id_tutor = pr.id_tutor
        LEFT JOIN usuarios ut ON ut.id_usuario = t.id_usuario
        WHERE pr.id_estudiante = :eid
          AND pe.activo = 1
          AND pe.id_instituto = :inst
        ORDER BY pr.created_at DESC LIMIT 1
    ");
    $st->execute([':eid' => $est['id_estudiante'], ':inst' => $idInst]);
    $practica = $st->fetch();

    if ($practica && $practica['estado'] !== 'rechazado') {
        $puedePostular = false;
    }
}

// ── Configuración de pago ───────────────────────────────────
$stCfgPago = $db->prepare("SELECT clave, valor FROM configuracion_institucional WHERE id_instituto = :id AND clave IN ('precio_practicas','email_facturacion')");
$stCfgPago->execute([':id' => $idInst]);
$cfgPago     = array_column($stCfgPago->fetchAll(), 'valor', 'clave');
$precioPract = number_format((float)($cfgPago['precio_practicas'] ?? '0.00'), 2);
$emailFac    = $cfgPago['email_facturacion'] ?? '';

// ── Directorios uploads ─────────────────────────────────────
$uploadDir = UPLOAD_PATH . DIRECTORY_SEPARATOR . 'solicitudes';
if (!is_dir($uploadDir)) mkdir($uploadDir, 0755, true);
$uploadDirComp = __DIR__ . '/../../assets/uploads/comprobantes_practicas/';
if (!is_dir($uploadDirComp)) mkdir($uploadDirComp, 0755, true);

// ── Helper: validación segura de archivos (3 capas) ─────────
// Verifica extensión + MIME type real (finfo) + magic bytes internos.
// Evita que un archivo con extensión cambiada sea aceptado.
//
// $file      → $_FILES['campo']
// $extsOk    → ['pdf','jpg','png'] extensiones permitidas
// $mimesOk   → ['application/pdf','image/jpeg'] MIMEs permitidos
// $magicOk   → [ ['bytes'=>'%PDF-','len'=>5], ... ] firmas internas
// Retorna: '' si todo ok, o string con el mensaje de error
function validarArchivoSeguro(array $file, array $extsOk, array $mimesOk, array $magicOk): string
{
    // Capa 1 — extensión del nombre
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!in_array($ext, $extsOk)) {
        return 'Extensión no permitida. Solo se aceptan: ' . strtoupper(implode(', ', $extsOk)) . '.';
    }

    // Capa 2 — MIME type real con finfo (lee bytes internos, no el nombre)
    if (function_exists('finfo_open')) {
        $fi   = finfo_open(FILEINFO_MIME_TYPE);
        $mime = $fi ? finfo_file($fi, $file['tmp_name']) : '';
        if ($fi) finfo_close($fi);
        if ($mime && !in_array($mime, $mimesOk)) {
            return 'El contenido del archivo no corresponde al tipo permitido (MIME inválido).';
        }
    }

    // Capa 3 — magic bytes (firma hexadecimal al inicio del archivo)
    $fh = fopen($file['tmp_name'], 'rb');
    if ($fh === false) {
        return 'No se pudo leer el archivo temporalmente.';
    }
    $maxLen  = max(array_column($magicOk, 'len'));
    $cabecera = fread($fh, $maxLen);
    fclose($fh);

    $magicValido = false;
    foreach ($magicOk as $firma) {
        if (substr($cabecera, 0, $firma['len']) === $firma['bytes']) {
            $magicValido = true;
            break;
        }
    }
    if (!$magicValido) {
        return 'El archivo no tiene la firma interna correcta. Puede ser un archivo falso con extensión cambiada.';
    }

    return ''; // sin errores
}

// Firmas (magic bytes) por tipo de archivo
const MAGIC = [
    'pdf'  => ['bytes' => '%PDF-',                       'len' => 5],
    'jpg'  => ['bytes' => "\xFF\xD8\xFF",                'len' => 3],
    'jpeg' => ['bytes' => "\xFF\xD8\xFF",                'len' => 3],
    'png'  => ['bytes' => "\x89PNG",                     'len' => 4],
    'doc'  => ['bytes' => "\xD0\xCF\x11\xE0",           'len' => 4], // OLE2
    'docx' => ['bytes' => "PK\x03\x04",                 'len' => 4], // ZIP/OpenXML
];

// ── POST: subir comprobante de pago ──────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$puedePostular && $practica) {
    $accionPago = $_POST['accion_pago'] ?? '';

    if ($accionPago === 'enviar_comprobante_practica') {
        $idPracPago    = (int)($_POST['id_practica_pago'] ?? 0);
        $estadoPagoAct = $practica['estado_pago'] ?? 'pendiente';

        if ($idPracPago && $idPracPago === (int)$practica['id_practica']
            && in_array($estadoPagoAct, ['pendiente','rechazado'])) {

            if (empty($_FILES['comprobante_pago']['name'])) {
                flashSet('err', 'Debes adjuntar el comprobante de pago o PDF de exoneración.');
            } else {
                $file = $_FILES['comprobante_pago'];
                $ext  = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

                if ($file['error'] !== UPLOAD_ERR_OK) {
                    flashSet('err', 'Error al recibir el archivo.');
                } elseif ($file['size'] > 5 * 1024 * 1024) {
                    flashSet('err', 'El archivo no puede superar 5 MB.');
                } else {
                    // ── Validación segura 3 capas: extensión + MIME + magic bytes ──
                    $errArchivo = validarArchivoSeguro(
                        $file,
                        ['pdf', 'jpg', 'jpeg', 'png'],
                        ['application/pdf', 'image/jpeg', 'image/png'],
                        array_values(array_intersect_key(MAGIC, array_flip(['pdf','jpg','jpeg','png'])))
                    );
                    if ($errArchivo) {
                        flashSet('err', $errArchivo);
                    } else {
                        $fname = 'comp_pract_' . $est['id_estudiante'] . '_' . time() . '.' . $ext;
                        // TODO-ONEDRIVE: subida local mantenida — ver GUIA_ONEDRIVE_SIGVP.md para migrar
                        if(move_uploaded_file($file['tmp_name'], $uploadDirComp . $fname)) {
                            $db->prepare("UPDATE practicas SET comprobante_pago=:c, estado_pago='enviada', updated_at=NOW() WHERE id_practica=:id")
                               ->execute([':c' => $fname, ':id' => $idPracPago]);

                            // Notificar a facturación del instituto
                            try {
                                $nombreEst = trim(($est['apellidos'] ?? '') . ' ' . ($est['nombres'] ?? '')) ?: 'Estudiante';
                                $stFac = $db->prepare("SELECT id_usuario FROM usuarios WHERE id_rol=9 AND activo=1 AND id_instituto=:inst");
                                $stFac->execute([':inst' => $idInst]);
                                $stN  = $db->prepare("INSERT INTO notificaciones (id_usuario,asunto,mensaje,leida,created_at) VALUES (:u,:a,:m,0,NOW())");
                                foreach ($stFac->fetchAll(PDO::FETCH_COLUMN) as $idFac) {
                                    $stN->execute([':u'=>$idFac,':a'=>'💳 Nuevo comprobante PPP',':m'=>"El estudiante {$nombreEst} subió su comprobante de pago de Prácticas Profesionales. Ingresa a Facturación para validarlo."]);
                                }
                            } catch (Exception $ex) {}

                            flashSet('ok', '✅ Comprobante enviado. Facturación validará tu pago y recibirás una notificación.');
                        } else {
                            flashSet('err', 'No se pudo guardar el archivo. Intenta nuevamente.');
                        }
                    } // fin else validación
                } // fin else tamaño/error
            } // fin else archivo vacío
        }
        header('Location: mi_practica.php'); exit;
    }
}

// ── POST: nueva postulación ─────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $puedePostular) {
    $tipoEmp  = $_POST['tipo_empresa']                ?? 'registrada';
    $idEmp    = (int)($_POST['id_empresa']            ?? 0);
    $idPer    = (int)($_POST['id_periodo']            ?? 0);
    $area     = trim($_POST['area_practica']          ?? '');
    $cargo    = trim($_POST['cargo_practica']         ?? '');
    $ntEmp    = trim($_POST['nombre_tutor_empresa']   ?? '');
    $etEmp    = trim($_POST['email_tutor_empresa']    ?? '');
    $ctEmp    = trim($_POST['cedula_tutor_empresa']   ?? '');
    $telEmp   = trim($_POST['telefono_tutor_empresa'] ?? '');
    $enNombre = trim($_POST['emp_nueva_nombre']       ?? '');
    $enRuc    = trim($_POST['emp_nueva_ruc']          ?? '');
    $enSector = $_POST['emp_nueva_sector']            ?? 'privado';
    $enAct    = trim($_POST['emp_nueva_actividad']    ?? '');
    $enDir    = trim($_POST['emp_nueva_direccion']    ?? '');
    $enCanton = trim($_POST['emp_nueva_canton']       ?? '');
    $enProv   = trim($_POST['emp_nueva_provincia']    ?? '');
    $enTel    = trim($_POST['emp_nueva_telefono']     ?? '');
    $enEmail  = trim($_POST['emp_nueva_email']        ?? '');
    $enRep    = trim($_POST['emp_nueva_representante']?? '');
    $enCarRep    = trim($_POST['emp_nueva_cargo_rep']    ?? '');
    $esNueva     = ($tipoEmp === 'nueva');
    // ── Nuevos campos: período, horario y observación ──────────
    $fechaInicio = trim($_POST['fecha_inicio'] ?? '');
    $fechaFin    = trim($_POST['fecha_fin']    ?? '');
    $diasArr     = $_POST['dias_laborables']   ?? [];
    $diasStr     = implode(',', array_map('trim', $diasArr));
    $observacion = trim($_POST['observacion_estudiante'] ?? '');
    $errores     = [];

    if (!$idPer) $errores[] = 'Selecciona un período académico.';
    if (!$area)  $errores[] = 'Indica el área de práctica.';
    if (!$fechaInicio)                       $errores[] = 'Indica la fecha de inicio de la práctica.';
    if (!$fechaFin)                          $errores[] = 'Indica la fecha de fin de la práctica.';
    if ($fechaInicio && $fechaFin && $fechaFin <= $fechaInicio)
                                             $errores[] = 'La fecha de fin debe ser posterior a la de inicio.';
    if (empty($diasArr))                     $errores[] = 'Selecciona al menos un día laboral.';
    if ($esNueva) {
        if (!$enNombre) $errores[] = 'Ingresa el nombre de la empresa.';
        if (!$enRuc)    $errores[] = 'Ingresa el RUC de la empresa.';
        if (!$enCanton) $errores[] = 'Ingresa el cantón de la empresa.';
    } else {
        if (!$idEmp)    $errores[] = 'Selecciona una empresa del catálogo.';
    }

    $docPath = null;
    if (!empty($_FILES['documento_solicitud']['name'])) {
        $file = $_FILES['documento_solicitud'];
        $ext  = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

        if ($file['error'] !== UPLOAD_ERR_OK) {
            $errores[] = 'Error al recibir el archivo.';
        } elseif ($file['size'] > 5*1024*1024) {
            $errores[] = 'El documento no puede superar 5 MB.';
        } else {
            // ── Validación segura 3 capas: extensión + MIME + magic bytes ──
            $errArchivo = validarArchivoSeguro(
                $file,
                ['pdf', 'doc', 'docx'],
                [
                    'application/pdf',
                    'application/msword',
                    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                    'application/zip', // algunos servidores reportan docx como zip
                ],
                array_values(array_intersect_key(MAGIC, array_flip(['pdf','doc','docx'])))
            );
            if ($errArchivo) {
                $errores[] = $errArchivo;
            } else {
                $fname = 'sol_' . $est['id_estudiante'] . '_' . time() . '.' . $ext;
                // TODO-ONEDRIVE: subida local mantenida — ver GUIA_ONEDRIVE_SIGVP.md para migrar
                        if(move_uploaded_file($file['tmp_name'], $uploadDir . DIRECTORY_SEPARATOR . $fname))
                    $docPath = 'solicitudes/' . $fname;
                else $errores[] = 'No se pudo guardar el documento.';
            }
        }
    } elseif ($esNueva) {
        $errores[] = 'Debes subir la carta o solicitud firmada por la empresa.';
    }

    // ── Guard: el usuario debe tener perfil de estudiante ────────
    if (!$est || empty($est['id_estudiante'])) {
        flashSet('err', '⚠️ Tu cuenta no tiene un perfil de estudiante registrado. Contacta al coordinador para que lo cree.');
        header('Location: mi_practica.php'); exit;
    }

    if ($errores) {
        flashSet('err', implode('<br>', $errores));
    } else {
        // Combinar días + observación en jornada_horario (columna ya existente)
        $jornadaFull = 'Días: ' . $diasStr;
        if ($observacion) $jornadaFull .= ' | Obs: ' . $observacion;

        try {
            // Horas requeridas desde la carrera del estudiante (no hardcodeado)
            $horasReq = (int)($est['carrera_horas_minimas'] ?? 6);
            if ($horasReq < 1) $horasReq = 6; // seguridad mínima

            $ins = $db->prepare("
                INSERT INTO practicas
                  (id_estudiante,id_empresa,id_periodo,area_practica,cargo_practica,
                   nombre_tutor_empresa,email_tutor_empresa,cedula_tutor_empresa,telefono_tutor_empresa,
                   documento_solicitud,empresa_nueva,
                   emp_nueva_nombre,emp_nueva_ruc,emp_nueva_sector,emp_nueva_actividad,
                   emp_nueva_direccion,emp_nueva_canton,emp_nueva_provincia,
                   emp_nueva_telefono,emp_nueva_email,emp_nueva_representante,emp_nueva_cargo_rep,
                   fecha_inicio,fecha_fin,jornada_horario,
                   estado,horas_requeridas)
                VALUES
                  (:eid,:emp,:per,:area,:cargo,:nt,:et,:ct,:tel,:doc,:nueva,
                   :enombre,:eruc,:esector,:eact,:edir,:ecan,:eprov,:etel,:eemail,:erep,:ecarrep,
                   :fini,:ffin,:jornada,
                   'postulado',:horas)
            ");
            $ins->execute([
                ':eid'=>$est['id_estudiante'],':emp'=>$esNueva?null:$idEmp,':per'=>$idPer,
                ':area'=>$area,':cargo'=>$cargo,':nt'=>$ntEmp,':et'=>$etEmp,
                ':ct'=>$ctEmp?:null,':tel'=>$telEmp?:null,':doc'=>$docPath,':nueva'=>$esNueva?1:0,
                ':enombre'=>$esNueva?$enNombre:null,':eruc'=>$esNueva?$enRuc:null,
                ':esector'=>$esNueva?$enSector:null,':eact'=>$esNueva?$enAct:null,
                ':edir'=>$esNueva?$enDir:null,':ecan'=>$esNueva?$enCanton:null,
                ':eprov'=>$esNueva?$enProv:null,':etel'=>$esNueva?$enTel:null,
                ':eemail'=>$esNueva?$enEmail:null,':erep'=>$esNueva?$enRep:null,
                ':ecarrep'=>$esNueva?$enCarRep:null,
                ':fini'=>$fechaInicio?:null,':ffin'=>$fechaFin?:null,
                ':jornada'=>$jornadaFull,
                ':horas'=>$horasReq,
            ]);
        } catch (Exception $ex) {
            flashSet('err', 'Error al guardar la solicitud: ' . $ex->getMessage());
            header('Location: mi_practica.php'); exit;
        }
        $idPractica = (int)$db->lastInsertId();
        registrarAudit($user['id'], 'postular_practica', 'practicas', $idPractica);

        try {
            $stCoords = $db->prepare("SELECT u.id_usuario FROM coordinadores co JOIN usuarios u ON u.id_usuario=co.id_usuario JOIN coordinador_carrera cc ON cc.id_coordinador=co.id_coordinador JOIN carreras car ON car.id_carrera=cc.id_carrera WHERE car.id_instituto=:inst AND u.activo=1");
            $stCoords->execute([':inst'=>$idInst]);
            $nombreEst = trim(($est['apellidos']??'').' '.($est['nombres']??''));
            $stN = $db->prepare("INSERT INTO notificaciones (id_usuario,asunto,mensaje,leida,created_at) VALUES (:uid,:asunto,:msg,0,NOW())");
            foreach ($stCoords->fetchAll(PDO::FETCH_COLUMN) as $uid) {
                $stN->execute([':uid'=>$uid,':asunto'=>'Nueva postulación PPP',':msg'=>"El estudiante {$nombreEst} envió una postulación de práctica preprofesional."]);
            }
        } catch (Exception $ex) {}

        flashSet('ok', 'Solicitud enviada. La coordinadora revisará tu postulación.');
        header('Location: mi_practica.php'); exit;
    }
}

$empresas = $db->query("SELECT id_empresa, razon_social FROM empresas " . instWhere() . " AND activa=1 ORDER BY razon_social")->fetchAll();
$periodos  = $db->prepare("SELECT id_periodo, nombre FROM periodos_academicos WHERE activo=1 AND id_instituto=:inst ORDER BY nombre DESC");
$periodos->execute([':inst' => $idInst]);
$periodos = $periodos->fetchAll();

// ── Variables de pago para la vista ─────────────────────────
$estadoPago  = $practica['estado_pago']     ?? 'pendiente';
$comprobante = $practica['comprobante_pago'] ?? null;
$esExonerado = (int)($practica['exonerado'] ?? 0);
$obsPago     = $practica['obs_pago']         ?? null;
$mostrarPago = $practica && !in_array($practica['estado'], ['rechazado','borrador']);
$puedeSubirComp = $mostrarPago && in_array($estadoPago, ['pendiente','rechazado']);
?>
<?php $paginaActual = 'mi_practica'; ?>
<!DOCTYPE html><html lang="es"><head>
<?php include __DIR__ . '/../../includes/head.php'; ?>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar.css">
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-estudiante.css">
<style>
.sec-emp{display:none}.sec-emp.on{display:block}
.tab-tipo{display:flex;gap:8px;margin-bottom:18px}
.tab-tipo label{cursor:pointer;padding:8px 20px;border-radius:8px;border:1px solid #2a3a4a;font-size:14px;color:#8b949e;transition:.2s}
.tab-tipo input[type=radio]:checked+label{border-color:#2ea8ff;color:#2ea8ff;background:#1a2a3a}
.tab-tipo input[type=radio]{display:none}
.badge-nueva{background:#ff9f0033;color:#ff9f00;border:1px solid #ff9f0055;font-size:11px;padding:2px 8px;border-radius:20px;vertical-align:middle}
.doc-link{display:inline-flex;align-items:center;gap:6px;background:#1c2a3a;border:1px solid #2ea8ff44;border-radius:8px;padding:6px 14px;font-size:13px;color:#2ea8ff;text-decoration:none}
.doc-link:hover{background:#223347;color:#2ea8ff}
.lbl-section{font-size:12px;color:#8b949e;font-weight:700;letter-spacing:.6px;margin-bottom:10px}
/* ─── Días laborables ─── */
.sigvp-dia{display:inline-flex;align-items:center;padding:5px 14px;border-radius:99px;border:1px solid #2a3a4a;font-size:13px;font-weight:600;color:#8b949e;cursor:pointer;user-select:none;transition:.15s}
.sigvp-dia.active{background:#0d2e1f;border-color:#1D9E75;color:#4ade80}

/* ─── Sección pago estilo titulación ─── */
.seccion-pago{background:#fff;border:1px solid #e2e8f0;border-left:4px solid #f97316;border-radius:14px;padding:1.5rem 1.75rem;margin-bottom:1.5rem;box-shadow:0 1px 6px rgba(0,0,0,.05);}
.sec-step-pago{font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#ea580c;margin-bottom:2px;}
.sec-title-pago{font-size:15px;font-weight:700;color:#0f172a;margin:0 0 2px;}
.sec-sub-pago{font-size:12px;color:#64748b;margin:0 0 1.25rem;}

/* ─── Upload zone ─── */
.upload-zone{border:2px dashed #cbd5e1;border-radius:10px;padding:1.5rem 1rem;text-align:center;cursor:pointer;transition:border-color .18s,background .18s;background:#f8fafc;}
.upload-zone:hover{border-color:#f97316;background:#fff7ed;}
.upload-zone.has-file{border-color:#059669;background:#ecfdf5;}
.upload-zone input[type=file]{display:none;}

/* ─── Alertas ─── */
.caja-info {background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:12px 16px;color:#1e40af;font-size:13px;}
.caja-ok   {background:#ecfdf5;border:1px solid #a7f3d0;border-radius:10px;padding:12px 16px;color:#065f46;font-size:13px;}
.caja-warn {background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:12px 16px;color:#92400e;font-size:13px;}
.caja-error{background:#fef2f2;border:1px solid #fecaca;border-radius:10px;padding:12px 16px;color:#991b1b;font-size:13px;}

/* ─── Comprobante preview (estado enviada) ─── */
.comp-preview{display:flex;align-items:center;gap:14px;background:#f0fdf4;border:1px solid #bbf7d0;border-radius:10px;padding:14px 16px;margin-bottom:14px;}

/* ─── Exonerado ─── */
.exon-badge{display:inline-flex;align-items:center;gap:4px;background:#fef3c7;color:#92400e;border:1px solid #fde68a;border-radius:6px;padding:3px 10px;font-size:11px;font-weight:700;}

/* ─── Divisor ─── */
.sec-divider{display:flex;align-items:center;justify-content:center;gap:10px;padding:.5rem 0 .25rem;color:#f97316;font-size:18px;}
</style>
</head><body>
<?php include __DIR__ . '/../../includes/navbar.php'; ?>
<div class="app-shell">
<?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'sidebar-estudiante.php'; ?>
<main class="main-area">
  <div class="page-header"><h4>Mi Práctica Preprofesional</h4><p>Estado y detalles de tu proceso</p></div>
  <?= flashHtml() ?>

  <?php if ($practica): ?>
  <!-- ══════════════════════════════════════
       BLOQUE 1 — Info de la práctica
  ══════════════════════════════════════ -->
  <div class="tbl-wrap p-4 mb-0">
    <div class="d-flex justify-content-between align-items-start flex-wrap gap-2 mb-3">
      <div>
        <h5 class="mb-1"><?= htmlspecialchars($practica['empresa']) ?>
          <?php if ($practica['empresa_nueva'] && !$practica['emp_nueva_registrada_id']): ?>
            <span class="badge-nueva ms-1">Empresa pendiente de registro</span>
          <?php endif; ?>
        </h5>
        <div style="font-size:13px;color:#8b949e;"><?= htmlspecialchars($practica['area_practica'] . ' — ' . $practica['cargo_practica']) ?></div>
      </div>
      <?= badgeEstado($practica['estado']) ?>
    </div>

    <div class="row g-3">
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">PERÍODO</div><div><?= htmlspecialchars($practica['periodo']) ?></div></div>
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">TUTOR ACADÉMICO</div><div><?= htmlspecialchars($practica['tutor_nombre'] ?? 'Sin asignar') ?></div></div>
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">TUTOR EMPRESA</div><div><?= htmlspecialchars($practica['nombre_tutor_empresa'] ?? '—') ?></div></div>
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">HORAS</div>
        <div><?= $practica['horas_cumplidas'] ?>/<?= $practica['horas_requeridas'] ?> h (<?= pct($practica['horas_cumplidas'], $practica['horas_requeridas']) ?>%)</div></div>
      <?php if ($practica['fecha_inicio']): ?>
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">INICIO</div><div><?= formatFecha($practica['fecha_inicio']) ?></div></div>
      <div class="col-sm-6"><div style="font-size:11px;color:#8b949e;">FIN PREVISTO</div><div><?= formatFecha($practica['fecha_fin']) ?></div></div>
      <?php endif; ?>
    </div>

    <?php if ($practica['documento_solicitud']): ?>
    <div class="mt-3">
      <div style="font-size:11px;color:#8b949e;margin-bottom:6px;">DOCUMENTO DE SOLICITUD</div>
      <a href="<?= UPLOAD_URL ?>/<?= htmlspecialchars($practica['documento_solicitud']) ?>" target="_blank" class="doc-link">
        <i class="fa fa-file-pdf"></i> Ver documento subido
      </a>
    </div>
    <?php endif; ?>

    <?php if ($practica['empresa_nueva']): ?>
    <div class="alert-dark-info p-3 mt-3">
      <strong><i class="fa fa-building me-1"></i> Empresa propuesta por ti:</strong>
      <div class="row g-2 mt-1" style="font-size:13px;">
        <div class="col-sm-4"><b>RUC:</b> <?= htmlspecialchars($practica['emp_nueva_ruc'] ?? '—') ?></div>
        <div class="col-sm-4"><b>Cantón:</b> <?= htmlspecialchars($practica['emp_nueva_canton'] ?? '—') ?>, <?= htmlspecialchars($practica['emp_nueva_provincia'] ?? '') ?></div>
        <div class="col-sm-4"><b>Representante:</b> <?= htmlspecialchars($practica['emp_nueva_representante'] ?? '—') ?></div>
      </div>
    </div>
    <?php endif; ?>

    <?php if ($practica['observaciones']): ?>
    <div class="alert-dark-info p-3 mt-3"><strong>Observaciones:</strong> <?= htmlspecialchars($practica['observaciones']) ?></div>
    <?php endif; ?>
    <?php if ($practica['motivo_rechazo']): ?>
    <div class="alert-dark-danger p-3 mt-3"><strong>Motivo de rechazo:</strong> <?= htmlspecialchars($practica['motivo_rechazo']) ?></div>
    <?php endif; ?>
  </div><!-- /bloque 1 -->

  <?php if ($mostrarPago): ?>
  <!-- ══════════════════════════════════════
       BLOQUE 2 — Comprobante de Pago
       (sección independiente igual a titulación)
  ══════════════════════════════════════ -->
  <div class="sec-divider"><i class="fa fa-arrow-down"></i></div>

  <div class="seccion-pago">
    <p class="sec-step-pago">Paso — Comprobante de Pago</p>
    <p class="sec-title-pago"><i class="fa fa-file-invoice-dollar me-2" style="color:#f97316;"></i>Pago del Trámite de Prácticas</p>
    <p class="sec-sub-pago">
      <?php if ((float)$precioPract > 0): ?>
        Adjunta el comprobante del pago de <strong style="color:#0f172a;">$<?= $precioPract ?></strong>.
        <?php if ($emailFac): ?>También puedes enviarlo a <a href="mailto:<?= htmlspecialchars($emailFac) ?>" style="color:#ea580c;font-weight:600;"><?= htmlspecialchars($emailFac) ?></a>.<?php endif; ?>
      <?php else: ?>
        Sube el comprobante o PDF de exoneración ($0.00) para que Facturación valide y puedas continuar.
      <?php endif; ?>
    </p>

    <!-- Estado: enviada -->
    <?php if ($estadoPago === 'enviada'): ?>
      <div class="comp-preview">
        <div style="width:44px;height:44px;background:#bbf7d0;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;">
          <i class="fa fa-file-invoice-dollar" style="color:#059669;font-size:20px;"></i>
        </div>
        <div>
          <div style="font-weight:700;color:#065f46;font-size:.9rem;">Comprobante enviado</div>
          <div style="font-size:12px;color:#059669;margin-top:2px;"><?= htmlspecialchars($comprobante) ?></div>
        </div>
      </div>
      <div class="caja-info">
        <i class="fa fa-hourglass-half me-2"></i>
        Facturación está validando tu comprobante. Recibirás una notificación cuando sea procesado.
      </div>

    <!-- Estado: aprobado -->
    <?php elseif ($estadoPago === 'aprobado'): ?>
      <div class="caja-ok">
        <i class="fa fa-circle-check me-2"></i>
        <strong>Pago validado.</strong>
        <?php if ($esExonerado): ?>
          <span class="exon-badge ms-2"><i class="fa fa-star"></i>Exonerado — $0.00</span>
        <?php else: ?>
          Monto: <strong>$<?= $precioPract ?></strong>
        <?php endif; ?>
        &nbsp;·&nbsp;Ya puedes continuar tu proceso de prácticas.
      </div>

    <!-- Estado: rechazado -->
    <?php elseif ($estadoPago === 'rechazado'): ?>
      <div class="caja-error mb-3">
        <i class="fa fa-circle-xmark me-2"></i>
        <strong>Comprobante rechazado.</strong>
        <?php if ($obsPago): ?> Motivo: <?= htmlspecialchars($obsPago) ?><?php endif; ?>
      </div>

    <!-- Estado: pendiente -->
    <?php else: ?>
      <div class="caja-warn mb-3" style="font-size:12px;">
        <i class="fa fa-circle-info me-2"></i>
        <?php if ((float)$precioPract > 0): ?>
          Realiza el depósito de <strong>$<?= $precioPract ?></strong> a las cuentas del Instituto y adjunta el comprobante aquí.
        <?php endif; ?>
        Si eres exonerado de pago, sube el PDF que lo acredita y Facturación lo marcará como $0.00.
      </div>
    <?php endif; ?>

    <!-- Formulario subida (pendiente o rechazado) -->
    <?php if ($puedeSubirComp): ?>
    <form method="POST" action="mi_practica.php" enctype="multipart/form-data" id="form-comp-pract">
      <input type="hidden" name="accion_pago" value="enviar_comprobante_practica">
      <input type="hidden" name="id_practica_pago" value="<?= $practica['id_practica'] ?>">

      <!-- Zona drag & drop — igual a titulación -->
      <div class="upload-zone mb-3" id="upload-zone-pract"
           onclick="document.getElementById('input-comp-pract').click()">
        <input type="file" name="comprobante_pago" id="input-comp-pract"
               accept=".pdf,.jpg,.jpeg,.png"
               onchange="previewCompPract(this)">
        <div id="ph-pract">
          <i class="fa fa-cloud-arrow-up" style="font-size:28px;color:#94a3b8;margin-bottom:8px;display:block;"></i>
          <div style="font-weight:600;color:#475569;font-size:13px;">Haz clic o arrastra el archivo aquí</div>
          <div style="font-size:11px;color:#94a3b8;margin-top:4px;">PDF, JPG o PNG · Máximo 5 MB</div>
        </div>
        <div id="pv-pract" style="display:none;">
          <i class="fa fa-file-check" style="font-size:26px;color:#059669;margin-bottom:6px;display:block;"></i>
          <div id="fn-pract" style="font-weight:600;color:#065f46;font-size:13px;"></div>
          <div style="font-size:11px;color:#059669;margin-top:2px;">Listo para enviar</div>
        </div>
      </div>

      <div class="d-flex gap-3 flex-wrap align-items-center">
        <button type="submit" class="btn btn-primary px-4" id="btn-env-comp" disabled>
          <i class="fa fa-paper-plane me-2"></i>Enviar Comprobante
        </button>
        <span style="font-size:12px;color:#94a3b8;">
          <i class="fa fa-lock me-1"></i>Tu comprobante irá a Facturación para validación
        </span>
      </div>
    </form>
    <?php endif; ?>
  </div><!-- /seccion-pago -->
  <?php endif; // mostrarPago ?>

  <?php endif; // practica ?>

  <?php if ($puedePostular): ?>
  <!-- ══ Formulario nueva solicitud ══ -->
  <div class="tbl-wrap p-4">
    <h5 class="mb-4"><i class="fa fa-plus-circle me-2" style="color:#2ea8ff;"></i>Solicitar práctica preprofesional</h5>
    <form method="POST" enctype="multipart/form-data" id="fPrac">

      <div class="lbl-section">PERÍODO ACADÉMICO</div>
      <div class="row g-3 mb-4">
        <div class="col-sm-5">
          <select name="id_periodo" class="form-select" required>
            <option value="">— selecciona período —</option>
            <?php foreach ($periodos as $p): ?>
            <option value="<?= $p['id_periodo'] ?>"><?= htmlspecialchars($p['nombre']) ?></option>
            <?php endforeach; ?>
          </select>
        </div>
      </div>

      <div class="lbl-section">EMPRESA DONDE REALIZARÁS LAS PRÁCTICAS</div>
      <div class="tab-tipo">
        <input type="radio" name="tipo_empresa" id="tReg" value="registrada" checked onchange="toggleEmp()">
        <label for="tReg"><i class="fa fa-list me-1"></i>Seleccionar del catálogo</label>
        <input type="radio" name="tipo_empresa" id="tNew" value="nueva" onchange="toggleEmp()">
        <label for="tNew"><i class="fa fa-building-circle-arrow-right me-1"></i>Registrar empresa nueva</label>
      </div>

      <div id="sReg" class="sec-emp on mb-4">
        <select name="id_empresa" id="selEmp" class="form-select" required>
          <option value="">— selecciona empresa —</option>
          <?php foreach ($empresas as $em): ?>
          <option value="<?= $em['id_empresa'] ?>"><?= htmlspecialchars($em['razon_social']) ?></option>
          <?php endforeach; ?>
        </select>
      </div>

      <div id="sNew" class="sec-emp mb-4">
        <div class="row g-3">
          <div class="col-sm-8"><label class="form-label">Razón social <span class="text-danger">*</span></label><input type="text" name="emp_nueva_nombre" class="form-control" maxlength="200"></div>
          <div class="col-sm-4"><label class="form-label">RUC <span class="text-danger">*</span></label><input type="text" name="emp_nueva_ruc" class="form-control" maxlength="13"></div>
          <div class="col-sm-4"><label class="form-label">Sector</label><select name="emp_nueva_sector" class="form-select"><option value="privado">Privado</option><option value="publico">Público</option><option value="mixto">Mixto</option><option value="ong">ONG</option></select></div>
          <div class="col-sm-8"><label class="form-label">Actividad económica</label><input type="text" name="emp_nueva_actividad" class="form-control" maxlength="200"></div>
          <div class="col-sm-5"><label class="form-label">Cantón <span class="text-danger">*</span></label><input type="text" name="emp_nueva_canton" class="form-control" maxlength="80"></div>
          <div class="col-sm-4"><label class="form-label">Provincia</label><input type="text" name="emp_nueva_provincia" class="form-control" maxlength="80"></div>
          <div class="col-sm-3"><label class="form-label">Teléfono</label><input type="text" name="emp_nueva_telefono" class="form-control" maxlength="15"></div>
          <div class="col-12"><label class="form-label">Dirección</label><input type="text" name="emp_nueva_direccion" class="form-control" maxlength="250"></div>
          <div class="col-sm-6"><label class="form-label">Email empresa</label><input type="email" name="emp_nueva_email" class="form-control" maxlength="120"></div>
          <div class="col-sm-6"><label class="form-label">Representante legal</label><input type="text" name="emp_nueva_representante" class="form-control" maxlength="120"></div>
          <div class="col-sm-6"><label class="form-label">Cargo representante</label><input type="text" name="emp_nueva_cargo_rep" class="form-control" maxlength="80"></div>
        </div>
      </div>

      <hr style="border-color:#2a3a4a;margin:4px 0 18px">
      <div class="lbl-section">DATOS DE LA PRÁCTICA</div>
      <div class="row g-3 mb-4">
        <div class="col-sm-6"><label class="form-label">Área de práctica <span class="text-danger">*</span></label><input type="text" name="area_practica" class="form-control" required maxlength="150" placeholder="Ej: Desarrollo de Software"></div>
        <div class="col-sm-6"><label class="form-label">Cargo</label><input type="text" name="cargo_practica" class="form-control" maxlength="100" placeholder="Ej: Desarrollador Junior"></div>
        <div class="col-sm-6"><label class="form-label">Nombre del supervisor</label><input type="text" name="nombre_tutor_empresa" class="form-control" maxlength="120"></div>
        <div class="col-sm-6"><label class="form-label">Email del supervisor</label><input type="email" name="email_tutor_empresa" class="form-control" maxlength="120"></div>
        <div class="col-sm-6"><label class="form-label">Cédula del supervisor</label><input type="text" name="cedula_tutor_empresa" class="form-control" maxlength="13" pattern="[0-9]{10,13}"></div>
        <div class="col-sm-6"><label class="form-label">Teléfono del supervisor</label><input type="text" name="telefono_tutor_empresa" class="form-control" maxlength="15"></div>
      </div>

      <hr style="border-color:#2a3a4a;margin:4px 0 18px">
      <div class="lbl-section">PERÍODO Y HORARIO DE PRÁCTICAS</div>
      <div class="row g-3 mb-3">
        <div class="col-sm-6">
          <label class="form-label">Fecha de inicio <span class="text-danger">*</span></label>
          <input type="date" name="fecha_inicio" class="form-control" required
                 min="<?= date('Y-m-d') ?>">
        </div>
        <div class="col-sm-6">
          <label class="form-label">Fecha de fin <span class="text-danger">*</span></label>
          <input type="date" name="fecha_fin" class="form-control" required
                 min="<?= date('Y-m-d', strtotime('+1 day')) ?>">
        </div>
      </div>

      <div class="mb-3">
        <label class="form-label">Días laborables <span class="text-danger">*</span></label>
        <div class="d-flex gap-2 flex-wrap mt-1" id="dias-wrap">
          <?php
          $todosDias = ['L'=>'Lun','M'=>'Mar','X'=>'Mié','J'=>'Jue','V'=>'Vie','S'=>'Sáb'];
          foreach ($todosDias as $val => $lbl): ?>
          <label class="sigvp-dia <?= in_array($val,['L','M','X','J','V'])?'active':'' ?>"
                 id="dia-label-<?= $val ?>">
            <input type="checkbox" name="dias_laborables[]" value="<?= $val ?>"
                   <?= in_array($val,['L','M','X','J','V'])?'checked':'' ?>
                   style="display:none;" onchange="toggleDiaLabel('<?= $val ?>')">
            <?= $lbl ?>
          </label>
          <?php endforeach; ?>
        </div>
        <div class="form-text" style="color:#8b949e;">Marca los días en que asistirás a las prácticas.</div>
      </div>

      <div class="mb-4">
        <label class="form-label">Observación <span style="color:#8b949e;font-size:12px;">(opcional)</span></label>
        <textarea name="observacion_estudiante" class="form-control" rows="3"
                  maxlength="500"
                  placeholder="Ej: Tengo clases los miércoles en la tarde, por lo que mi horario ese día será de 08:00 a 13:00..."></textarea>
        <div class="form-text" style="color:#8b949e;">Cualquier detalle adicional que el coordinador deba conocer.</div>
      </div>

      <hr style="border-color:#2a3a4a;margin:4px 0 18px">
      <div class="lbl-section">DOCUMENTO DE SOLICITUD DE PASANTÍAS
        <span id="docObl" style="display:none;color:#ff6b6b;font-size:11px;"> — OBLIGATORIO para empresa nueva</span>
      </div>
      <div class="row g-3 mb-4">
        <div class="col-md-7">
          <input type="file" name="documento_solicitud" class="form-control" accept=".pdf,.doc,.docx">
          <div class="form-text" style="color:#8b949e;">Carta de aceptación o solicitud firmada. PDF, DOC o DOCX. Máx. 5 MB.</div>
        </div>
      </div>

      <button type="submit" class="btn btn-primary"><i class="fa fa-paper-plane me-2"></i>Enviar solicitud</button>
    </form>
  </div>
  <?php endif; ?>

</main>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script>
<script>
/* ── Toggle empresa nueva/registrada ── */
function toggleEmp() {
  var esNueva = document.getElementById('tNew').checked;
  document.getElementById('sReg').classList.toggle('on', !esNueva);
  document.getElementById('sNew').classList.toggle('on',  esNueva);
  document.getElementById('selEmp').required = !esNueva;
  document.getElementById('docObl').style.display = esNueva ? 'inline' : 'none';
  ['emp_nueva_nombre','emp_nueva_ruc','emp_nueva_canton'].forEach(function(n){
    var el = document.querySelector('[name="'+n+'"]');
    if (el) el.required = esNueva;
  });
}
toggleEmp();

/* ── Días laborables: toggle pill ── */
function toggleDiaLabel(val) {
  var lbl = document.getElementById('dia-label-' + val);
  var cb  = lbl.querySelector('input[type=checkbox]');
  lbl.classList.toggle('active', cb.checked);
}
/* Clic en la pill activa el checkbox */
document.querySelectorAll('.sigvp-dia').forEach(function(lbl){
  lbl.addEventListener('click', function(){
    var cb = lbl.querySelector('input[type=checkbox]');
    cb.checked = !cb.checked;
    lbl.classList.toggle('active', cb.checked);
  });
});

/* ── Validar fecha fin > fecha inicio ── */
var fIni = document.querySelector('[name=fecha_inicio]');
var fFin = document.querySelector('[name=fecha_fin]');
if (fIni && fFin) {
  fIni.addEventListener('change', function(){
    if (fFin.value && fFin.value <= fIni.value) fFin.value = '';
    fFin.min = fIni.value;
  });
}

/* ── Preview upload comprobante ── */
function previewCompPract(input) {
  if (input.files && input.files[0]) {
    document.getElementById('fn-pract').textContent = input.files[0].name;
    document.getElementById('ph-pract').style.display = 'none';
    document.getElementById('pv-pract').style.display = 'block';
    document.getElementById('upload-zone-pract').classList.add('has-file');
    var btn = document.getElementById('btn-env-comp');
    if (btn) btn.disabled = false;
  }
}

/* ── Drag & drop ── */
var zone = document.getElementById('upload-zone-pract');
if (zone) {
  zone.addEventListener('dragover', function(e){ e.preventDefault(); zone.style.borderColor='#f97316'; });
  zone.addEventListener('dragleave', function(){ zone.style.borderColor=''; });
  zone.addEventListener('drop', function(e){
    e.preventDefault();
    zone.style.borderColor = '';
    var input = document.getElementById('input-comp-pract');
    if (e.dataTransfer.files.length) {
      try {
        var dt = new DataTransfer();
        dt.items.add(e.dataTransfer.files[0]);
        input.files = dt.files;
      } catch(ex) {}
      previewCompPract(input);
    }
  });
}
</script>
</body>
</html>