<?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/flash.php';
require_once __DIR__ . '/../../includes/functions.php';
requireRol(ROL_ESTUDIANTE);

$user = currentUser();
$db   = getDB();
$pageTitle = 'Mi Perfil';

// ── Cargar datos actuales ─────────────────────────────────────────────────
$u = $db->prepare("
    SELECT u.*,
           e.id_estudiante, e.codigo_estudiante, e.semestre_actual,
           c.nombre AS carrera_nombre,
           p.nombre AS periodo_nombre
    FROM   usuarios u
    JOIN   estudiantes e  ON e.id_usuario  = u.id_usuario
    JOIN   carreras c     ON c.id_carrera  = e.id_carrera
    LEFT JOIN periodos_academicos p ON p.id_periodo = e.id_periodo_ingreso
    WHERE  u.id_usuario = :id
");
$u->execute([':id' => $user['id']]);
$u = $u->fetch();

$idEst = (int)($u['id_estudiante'] ?? 0);

// Datos extendidos mat_estudiantes
$me = null;
if ($idEst) {
    $q = $db->prepare("SELECT * FROM mat_estudiantes WHERE id_estudiante = :id LIMIT 1");
    $q->execute([':id' => $idEst]);
    $me = $q->fetch();
}

// Datos ficha socioeconómica (estado_civil)
$mfs = null;
if ($idEst) {
    $q2 = $db->prepare("SELECT * FROM mat_ficha_socioeconomica WHERE id_estudiante = :id LIMIT 1");
    $q2->execute([':id' => $idEst]);
    $mfs = $q2->fetch();
}

// Práctica activa del estudiante (para jornada_horario)
$practica = null;
if ($idEst) {
    $qp = $db->prepare("
        SELECT id_practica, jornada_horario
        FROM   practicas
        WHERE  id_estudiante = :id
          AND  estado NOT IN ('rechazado','completado')
        ORDER BY created_at DESC
        LIMIT 1
    ");
    $qp->execute([':id' => $idEst]);
    $practica = $qp->fetch();
}

// ── Prácticas con datos de ficha PPP (TODAS, incluidas completadas) ────────
$fichasPPP = [];
if ($idEst) {
    $qf = $db->prepare("
        SELECT pr.id_practica, pr.fecha_inicio, pr.fecha_fin, pr.estado,
               pr.horas_requeridas, pr.horas_cumplidas,
               pr.ficha_estado, pr.ficha_doc_est, pr.ficha_doc_final,
               pr.ficha_enviada_at,
               em.razon_social AS empresa
        FROM   practicas pr
        JOIN   empresas em ON em.id_empresa = pr.id_empresa
        WHERE  pr.id_estudiante = :id
        ORDER BY pr.fecha_inicio DESC
    ");
    $qf->execute([':id' => $idEst]);
    $fichasPPP = $qf->fetchAll();
}

// ══════════════════════════════════════════════════════════════════════════════
// ── FUNCIÓN SEGURA DE VALIDACIÓN DE ARCHIVOS ─────────────────────────────────
// Verifica: magic bytes reales, extensión, MIME, tamaño y nombre limpio
// ══════════════════════════════════════════════════════════════════════════════
function validarArchivoSeguro(array $file, array $tiposPermitidos, int $maxBytes = 5242880): array {
    // $tiposPermitidos = ['jpg' => 'image/jpeg', 'png' => 'image/png', ...]

    // 1. ¿Hubo error en la subida?
    if ($file['error'] !== UPLOAD_ERR_OK) {
        $errMsg = [
            UPLOAD_ERR_INI_SIZE   => 'El archivo supera el límite del servidor.',
            UPLOAD_ERR_FORM_SIZE  => 'El archivo supera el límite del formulario.',
            UPLOAD_ERR_PARTIAL    => 'La subida fue interrumpida. Intenta de nuevo.',
            UPLOAD_ERR_NO_FILE    => 'No se seleccionó ningún archivo.',
            UPLOAD_ERR_NO_TMP_DIR => 'Error interno del servidor (sin carpeta temporal).',
            UPLOAD_ERR_CANT_WRITE => 'Error al escribir en disco.',
        ];
        return ['ok' => false, 'error' => $errMsg[$file['error']] ?? 'Error desconocido al subir.'];
    }

    // 2. Verificar que es un archivo realmente subido (evita path traversal)
    if (!is_uploaded_file($file['tmp_name'])) {
        return ['ok' => false, 'error' => 'Archivo inválido.'];
    }

    // 3. Límite de tamaño en código (no solo en php.ini)
    if ($file['size'] > $maxBytes) {
        $mb = round($maxBytes / 1048576, 1);
        return ['ok' => false, 'error' => "El archivo es demasiado grande. Máximo permitido: {$mb} MB."];
    }

    // 4. Extensión del archivo (nombre real, no el del cliente)
    $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
    if (!array_key_exists($ext, $tiposPermitidos)) {
        $permitidos = implode(', ', array_map('strtoupper', array_keys($tiposPermitidos)));
        return ['ok' => false, 'error' => "Formato no permitido. Solo se aceptan: {$permitidos}."];
    }

    // 5. ★ VERIFICACIÓN REAL de magic bytes con finfo ★
    //    Esto detecta un .php renombrado como .jpg, un .exe camuflado, etc.
    $finfo    = new finfo(FILEINFO_MIME_TYPE);
    $mimeReal = $finfo->file($file['tmp_name']);

    if ($mimeReal !== $tiposPermitidos[$ext]) {
        error_log("[SIGVP][UPLOAD] Archivo bloqueado — MIME real: {$mimeReal} | ext: {$ext} | IP: " . ($_SERVER['REMOTE_ADDR'] ?? '?'));
        return ['ok' => false, 'error' => 'El contenido del archivo no coincide con su extensión. Archivo rechazado por seguridad.'];
    }

    // 6. Para imágenes: verificar que realmente se pueden leer como imagen
    if (in_array($mimeReal, ['image/jpeg','image/png','image/webp','image/gif'])) {
        $imgInfo = @getimagesize($file['tmp_name']);
        if ($imgInfo === false) {
            return ['ok' => false, 'error' => 'El archivo no es una imagen válida.'];
        }
    }

    // 7. Nombre seguro: aleatorio, sin caracteres peligrosos, sin usar el nombre del cliente
    $nombreSeguro = bin2hex(random_bytes(16)) . '.' . $ext;

    return ['ok' => true, 'ext' => $ext, 'mime' => $mimeReal, 'nombre' => $nombreSeguro];
}

// ── GUARDAR ───────────────────────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $seccion = $_POST['seccion'] ?? '';

    // ── Datos de contacto ──────────────────────────────────────────────
    if ($seccion === 'contacto') {
        $tel    = trim($_POST['telefono']       ?? '');
        $emailp = trim($_POST['email_personal'] ?? '');
        $db->prepare("UPDATE usuarios SET telefono=:t, email_personal=:ep WHERE id_usuario=:id")
           ->execute([':t'=>$tel, ':ep'=>$emailp, ':id'=>$user['id']]);
        flashSet('ok', '✅ Datos de contacto actualizados.');
    }

    // ── Datos personales extendidos ────────────────────────────────────
    elseif ($seccion === 'personal' && $idEst) {
        $dom          = trim($_POST['domicilio']              ?? '');
        $lugar        = trim($_POST['lugar_nacimiento']       ?? '');
        $gen          = $_POST['genero']                      ?? null;
        $fn           = $_POST['fecha_nacimiento']            ?? null;
        $disc         = $_POST['tiene_discapacidad']          ?? 'no';
        $pdisc        = $_POST['porcentaje_discapacidad']     ?? null;
        $disp         = trim($_POST['dispositivos_tecnologicos'] ?? '');
        $inet         = $_POST['acceso_internet']             ?? 'no';
        // Nuevos campos
        $perfilLab    = trim($_POST['perfil_laboral']         ?? '');
        $ubMaps       = trim($_POST['ubicacion_maps']         ?? '');
        $estadoCivil  = trim($_POST['estado_civil']           ?? '');
        $jornada      = trim($_POST['jornada_horario']        ?? '');

        if ($me) {
            $db->prepare("
                UPDATE mat_estudiantes SET
                    domicilio=:dom, lugar_nacimiento=:lugar, genero=:gen,
                    fecha_nacimiento=:fn, tiene_discapacidad=:disc,
                    porcentaje_discapacidad=:pdisc, dispositivos_tecnologicos=:disp,
                    acceso_internet=:inet,
                    perfil_laboral=:pl, ubicacion_maps=:maps
                WHERE id_estudiante=:ide
            ")->execute([
                ':dom'=>$dom, ':lugar'=>$lugar, ':gen'=>($gen ?: null),
                ':fn'=>($fn ?: null), ':disc'=>$disc,
                ':pdisc'=>($pdisc !== '' ? (int)$pdisc : null),
                ':disp'=>$disp, ':inet'=>$inet,
                ':pl'=>($perfilLab ?: null),
                ':maps'=>($ubMaps ?: null),
                ':ide'=>$idEst,
            ]);
        } else {
            $db->prepare("
                INSERT INTO mat_estudiantes
                    (id_estudiante, numero_matricula, cedula, domicilio, lugar_nacimiento,
                     genero, fecha_nacimiento, tiene_discapacidad, porcentaje_discapacidad,
                     dispositivos_tecnologicos, acceso_internet, perfil_laboral, ubicacion_maps)
                VALUES
                    (:ide, :mat, :ced, :dom, :lugar, :gen, :fn, :disc, :pdisc,
                     :disp, :inet, :pl, :maps)
            ")->execute([
                ':ide'=>$idEst, ':mat'=>$u['codigo_estudiante'],
                ':ced'=>$u['cedula'], ':dom'=>$dom, ':lugar'=>$lugar,
                ':gen'=>($gen ?: null), ':fn'=>($fn ?: null),
                ':disc'=>$disc,
                ':pdisc'=>($pdisc !== '' ? (int)$pdisc : null),
                ':disp'=>$disp, ':inet'=>$inet,
                ':pl'=>($perfilLab ?: null),
                ':maps'=>($ubMaps ?: null),
            ]);
        }

        // Guardar estado_civil en mat_ficha_socioeconomica
        if ($estadoCivil !== '') {
            if ($mfs) {
                $db->prepare("UPDATE mat_ficha_socioeconomica SET estado_civil=:ec WHERE id_estudiante=:ide")
                   ->execute([':ec'=>$estadoCivil, ':ide'=>$idEst]);
            } else {
                $db->prepare("INSERT INTO mat_ficha_socioeconomica (id_estudiante, estado_civil) VALUES (:ide, :ec)
                              ON DUPLICATE KEY UPDATE estado_civil=:ec2")
                   ->execute([':ide'=>$idEst, ':ec'=>$estadoCivil, ':ec2'=>$estadoCivil]);
            }
        }

        // Guardar jornada_horario en la práctica activa
        if ($jornada !== '' && !empty($practica['id_practica'])) {
            $db->prepare("UPDATE practicas SET jornada_horario=:j WHERE id_practica=:idp")
               ->execute([':j'=>$jornada, ':idp'=>$practica['id_practica']]);
        }

        flashSet('ok', '✅ Datos personales actualizados.');
    }

    // ── Foto de carnet ─────────────────────────────────────────────────
    elseif ($seccion === 'foto' && $idEst) {
        if (isset($_FILES['foto'])) {
            $tiposFoto = [
                'jpg'  => 'image/jpeg',
                'jpeg' => 'image/jpeg',
                'png'  => 'image/png',
                'webp' => 'image/webp',
            ];
            $val = validarArchivoSeguro($_FILES['foto'], $tiposFoto, 3 * 1024 * 1024); // máx 3 MB

            if (!$val['ok']) {
                flashSet('err', '❌ ' . $val['error']);
            } else {
                try {
                    $rutaOD = OneDriveStorage::upload($_FILES['foto']['tmp_name'], 'fotos_perfil', $val['nombre'], null);
                    $ruta = $rutaOD;
                    if ($me) {
                        $db->prepare("UPDATE mat_estudiantes SET foto_carnet=:f WHERE id_estudiante=:ide")
                           ->execute([':f'=>$ruta,':ide'=>$idEst]);
                    } else {
                        $db->prepare("
                            INSERT INTO mat_estudiantes (id_estudiante,numero_matricula,cedula,foto_carnet)
                            VALUES (:ide,:mat,:ced,:f)
                            ON DUPLICATE KEY UPDATE foto_carnet=:f2
                        ")->execute([':ide'=>$idEst,':mat'=>$u['codigo_estudiante'],
                                     ':ced'=>$u['cedula'],':f'=>$ruta,':f2'=>$ruta]);
                    }
                    flashSet('ok', '✅ Foto actualizada correctamente.');
                } catch(Exception $e) {
                    flashSet('err', '❌ Error al subir a OneDrive: '.$e->getMessage());
                }
            }
        } else {
            flashSet('err', '❌ No se recibió ningún archivo.');
        }
    }

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

// ── Recargar datos después de guardar ─────────────────────────────────────
$u = $db->prepare("
    SELECT u.*, e.id_estudiante, e.codigo_estudiante, e.semestre_actual,
           c.nombre AS carrera_nombre, p.nombre AS periodo_nombre
    FROM   usuarios u
    JOIN   estudiantes e ON e.id_usuario=u.id_usuario
    JOIN   carreras c    ON c.id_carrera=e.id_carrera
    LEFT JOIN periodos_academicos p ON p.id_periodo=e.id_periodo_ingreso
    WHERE  u.id_usuario=:id
");
$u->execute([':id'=>$user['id']]);
$u = $u->fetch();
$idEst = (int)($u['id_estudiante'] ?? 0);

if ($idEst) {
    $q = $db->prepare("SELECT * FROM mat_estudiantes WHERE id_estudiante=:id LIMIT 1");
    $q->execute([':id'=>$idEst]);
    $me = $q->fetch();

    $q2 = $db->prepare("SELECT * FROM mat_ficha_socioeconomica WHERE id_estudiante=:id LIMIT 1");
    $q2->execute([':id'=>$idEst]);
    $mfs = $q2->fetch();

    $qp = $db->prepare("
        SELECT id_practica, jornada_horario
        FROM   practicas
        WHERE  id_estudiante = :id
          AND  estado NOT IN ('rechazado','completado')
        ORDER BY created_at DESC
        LIMIT 1
    ");
    $qp->execute([':id'=>$idEst]);
    $practica = $qp->fetch();

    // Recargar fichas PPP
    $qf = $db->prepare("
        SELECT pr.id_practica, pr.fecha_inicio, pr.fecha_fin, pr.estado,
               pr.horas_requeridas, pr.horas_cumplidas,
               pr.ficha_estado, pr.ficha_doc_est, pr.ficha_doc_final,
               pr.ficha_enviada_at,
               em.razon_social AS empresa
        FROM   practicas pr
        JOIN   empresas em ON em.id_empresa = pr.id_empresa
        WHERE  pr.id_estudiante = :id2
        ORDER BY pr.fecha_inicio DESC
    ");
    $qf->execute([':id2'=>$idEst]);
    $fichasPPP = $qf->fetchAll();
}

// Helper para construir URL de embed de Google Maps
function mapsEmbedUrl(string $url): string {
    // Si ya es una URL embed, devolverla tal cual
    if (str_contains($url, 'maps/embed')) return $url;
    // Convertir URL normal a embed genérico usando el enlace de share
    return 'https://maps.google.com/maps?q=' . urlencode($url) . '&output=embed';
}
?>
<?php $paginaActual = 'perfil'; ?>
<!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>
.profile-avatar{width:110px;height:130px;border-radius:10px;overflow:hidden;border:3px solid #e2e8f0;
  background:#f1f5f9;display:flex;align-items:center;justify-content:center;}
.profile-avatar img{width:100%;height:100%;object-fit:cover;}
.section-card{background:#fff;border:1px solid #e5e7eb;border-radius:12px;padding:22px 24px;margin-bottom:18px;}
.section-title{font-size:14px;font-weight:700;color:#1e3a5f;margin-bottom:16px;
  padding-bottom:8px;border-bottom:2px solid #e5e7eb;display:flex;align-items:center;gap:6px;}
.readonly-note{font-size:11px;color:#9ca3af;margin-top:3px;}
.form-label{font-size:12px;font-weight:600;color:#374151;margin-bottom:4px;text-transform:uppercase;letter-spacing:.03em;}
.maps-help{font-size:11px;color:#6b7280;margin-top:4px;line-height:1.5;}
.maps-help a{color:#2563eb;}

/* ── Ficha PPP en perfil ── */
.ficha-ppp-card{border:1px solid #e5e7eb;border-radius:10px;overflow:hidden;margin-bottom:12px;}
.ficha-ppp-head{background:#fef2f2;padding:12px 16px;border-bottom:1px solid #fecaca;
  display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:6px;}
.ficha-ppp-body{padding:16px;}
.badge-fp{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;
  border-radius:20px;font-size:10px;font-weight:700;white-space:nowrap;}
.badge-fp-none   {background:#f3f4f6;color:#6b7280;border:1px solid #e5e7eb;}
.badge-fp-env    {background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;}
.badge-fp-est    {background:#fefce8;color:#a16207;border:1px solid #fde68a;}
.badge-fp-ok     {background:#f0fdf4;color:#15803d;border:1px solid #bbf7d0;}
.btn-fp-pdf{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;
  background:#fee2e2;color:#991b1b;border:1px solid #fca5a5;border-radius:8px;
  font-size:12px;font-weight:700;text-decoration:none;cursor:pointer;}
.btn-fp-pdf:hover{background:#fca5a5;color:#7f1d1d;}
.btn-fp-up{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;
  background:#dbeafe;color:#1e40af;border:1px solid #93c5fd;border-radius:8px;
  font-size:12px;font-weight:700;cursor:pointer;border:none;}
.btn-fp-up:hover{background:#bfdbfe;}
.btn-fp-dl{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;
  background:#d1fae5;color:#065f46;border:1px solid #6ee7b7;border-radius:8px;
  font-size:12px;font-weight:700;text-decoration:none;}
.btn-fp-dl:hover{background:#a7f3d0;color:#065f46;}
.upload-drop{border:2px dashed #93c5fd;border-radius:8px;padding:14px;
  text-align:center;background:#f8fbff;cursor:pointer;transition:.2s;}
.upload-drop:hover{border-color:#3b82f6;background:#eff6ff;}
.upload-drop input[type=file]{display:none;}
</style>
</head>

<body>
<?php include __DIR__.'/../../includes/navbar.php'; ?>

<div class="app-shell">
  <?php include __DIR__ . '/../../includes/sidebar-estudiante.php'; ?>

  <main class="main-area">

    <?= flashHtml() ?>

    <div class="page-header d-flex justify-content-between align-items-center mb-4">
      <h4 class="mb-0"><i class="fa fa-user-circle me-2" style="color:#2563eb;"></i>Mi Perfil</h4>
    </div>

    <!-- ── FOTO Y PRESENTACIÓN ───────────────────────────────── -->
    <div class="section-card d-flex gap-4 align-items-center flex-wrap">
      <div class="profile-avatar">
        <?php
          // Resolver URL de la foto (OneDrive o local)
          $fotoUrl = null;
          if (!empty($me['foto_carnet'])) {
              if (OneDriveStorage::esOneDrive($me['foto_carnet'])) {
                  // Obtiene URL temporal directa de Azure (~1 hora de validez)
                  $fotoUrl = OneDriveStorage::getDownloadUrl($me['foto_carnet']);
              } else {
                  // Ruta local antigua (uploads/foto_xxx.jpg)
                  $fotoUrl = UPLOAD_URL . '/' . ltrim($me['foto_carnet'], '/');
              }
          }
        ?>
        <?php if ($fotoUrl): ?>
          <img src="<?= htmlspecialchars($fotoUrl) ?>" alt="Foto de carnet"
               onerror="this.style.display='none';this.nextElementSibling.style.display='flex';">
          <i class="fa fa-user fa-3x" style="color:#cbd5e1;display:none;"></i>
        <?php else: ?>
          <i class="fa fa-user fa-3x" style="color:#cbd5e1;"></i>
        <?php endif; ?>
      </div>
      <div>
        <div style="font-size:18px;font-weight:700;color:#1e293b;">
          <?= htmlspecialchars($u['nombres'].' '.$u['apellidos']) ?>
        </div>
        <div style="font-size:13px;color:#64748b;margin-top:2px;">
          <?= htmlspecialchars($u['carrera_nombre'] ?? '') ?> · <?= htmlspecialchars($u['codigo_estudiante'] ?? '') ?>
        </div>
        <div style="font-size:12px;color:#94a3b8;margin-top:2px;">
          <?= htmlspecialchars($u['email']) ?>
        </div>
      </div>
      <!-- Subir foto -->
      <div class="ms-auto">
        <form method="POST" enctype="multipart/form-data">
          <input type="hidden" name="seccion" value="foto">
          <label class="form-label d-block">Cambiar foto de carnet</label>
          <div class="d-flex gap-2 align-items-center">
            <input type="file" name="foto" accept=".jpg,.jpeg,.png,.webp"
                   class="form-control form-control-sm" style="max-width:200px;">
            <button type="submit" class="btn btn-sm btn-outline-secondary">
              <i class="fa fa-upload me-1"></i>Subir
            </button>
          </div>
          <div class="readonly-note">JPG, PNG o WEBP. Máximo recomendado: 2MB.</div>
        </form>
      </div>
    </div>

    <!-- ── DATOS DE CONTACTO ──────────────────────────────────── -->
    <div class="section-card">
      <div class="section-title"><i class="fa fa-phone me-2"></i>Datos de Contacto</div>
      <form method="POST">
        <input type="hidden" name="seccion" value="contacto">
        <div class="row g-3">
          <div class="col-md-6">
            <label class="form-label">Nombres y Apellidos</label>
            <input type="text" class="form-control"
                   value="<?= htmlspecialchars($u['nombres'].' '.$u['apellidos']) ?>" disabled>
            <div class="readonly-note">Solo el administrador puede modificar el nombre.</div>
          </div>
          <div class="col-md-6">
            <label class="form-label">Cédula de Identidad</label>
            <input type="text" class="form-control" value="<?= htmlspecialchars($u['cedula']) ?>" disabled>
          </div>
          <div class="col-md-6">
            <label class="form-label">Email Institucional</label>
            <input type="email" class="form-control" value="<?= htmlspecialchars($u['email']) ?>" disabled>
            <div class="readonly-note">Asignado por la institución.</div>
          </div>
          <div class="col-md-6">
            <label class="form-label">Email Personal *</label>
            <input type="email" name="email_personal" class="form-control"
                   value="<?= htmlspecialchars($u['email_personal'] ?? '') ?>"
                   placeholder="tucorreo@gmail.com">
          </div>
          <div class="col-md-6">
            <label class="form-label">Teléfono / Celular *</label>
            <input type="tel" name="telefono" class="form-control" maxlength="15"
                   value="<?= htmlspecialchars($u['telefono'] ?? '') ?>"
                   placeholder="09XXXXXXXX">
          </div>
          <div class="col-12 d-flex gap-2 pt-1">
            <button type="submit" class="btn btn-primary btn-sm px-4">
              <i class="fa fa-save me-1"></i>Guardar contacto
            </button>
            <a href="<?= BASE_URL ?>/auth/cambiar_password.php" class="btn btn-outline-secondary btn-sm">
              <i class="fa fa-lock me-1"></i>Cambiar contraseña
            </a>
          </div>
        </div>
      </form>
    </div>

    <!-- ── DATOS PERSONALES EXTENDIDOS ────────────────────────── -->
    <div class="section-card">
      <div class="section-title"><i class="fa fa-address-card me-2"></i>Datos Personales</div>
      <form method="POST">
        <input type="hidden" name="seccion" value="personal">
        <div class="row g-3">

          <!-- Género -->
          <div class="col-md-4">
            <label class="form-label">Género</label>
            <select name="genero" class="form-select">
              <option value="">— Seleccionar —</option>
              <option value="M" <?= ($me['genero']??'')==='M'?'selected':'' ?>>Masculino</option>
              <option value="F" <?= ($me['genero']??'')==='F'?'selected':'' ?>>Femenino</option>
              <option value="O" <?= ($me['genero']??'')==='O'?'selected':'' ?>>Otro / Prefiero no decir</option>
            </select>
          </div>

          <!-- Estado Civil ★ NUEVO ★ -->
          <div class="col-md-4">
            <label class="form-label">Estado Civil</label>
            <select name="estado_civil" class="form-select">
              <option value="">— Seleccionar —</option>
              <?php
              $ecOpts = ['Soltero/a','Casado/a','Unión libre','Divorciado/a','Viudo/a'];
              $ecVal  = $mfs['estado_civil'] ?? '';
              foreach ($ecOpts as $opt):
                  $sel = (strtolower($ecVal) === strtolower($opt)) ? 'selected' : '';
              ?>
              <option value="<?= htmlspecialchars($opt) ?>" <?= $sel ?>><?= htmlspecialchars($opt) ?></option>
              <?php endforeach; ?>
            </select>
          </div>

          <!-- Fecha de Nacimiento -->
          <div class="col-md-4">
            <label class="form-label">Fecha de Nacimiento</label>
            <input type="date" name="fecha_nacimiento" class="form-control"
                   value="<?= htmlspecialchars($me['fecha_nacimiento'] ?? '') ?>">
          </div>

          <!-- Lugar de Nacimiento -->
          <div class="col-md-6">
            <label class="form-label">Lugar de Nacimiento</label>
            <input type="text" name="lugar_nacimiento" class="form-control"
                   value="<?= htmlspecialchars($me['lugar_nacimiento'] ?? '') ?>"
                   placeholder="Ciudad, Provincia">
          </div>

          <!-- Dirección Domiciliaria -->
          <div class="col-md-6">
            <label class="form-label">Dirección Domiciliaria</label>
            <input type="text" name="domicilio" class="form-control"
                   value="<?= htmlspecialchars($me['domicilio'] ?? '') ?>"
                   placeholder="Calle, barrio, ciudad">
          </div>

          <!-- Perfil Laboral ★ NUEVO ★ -->
          <div class="col-md-6">
            <label class="form-label">
              <i class="fa fa-briefcase me-1" style="color:#2563eb;"></i>
              Perfil que va a laborar en la empresa
            </label>
            <input type="text" name="perfil_laboral" class="form-control"
                   value="<?= htmlspecialchars($me['perfil_laboral'] ?? '') ?>"
                   placeholder="Ej: Desarrollador Web, Asistente Contable, Diseñador Gráfico...">
            <div class="readonly-note">Indica el cargo o área donde realizarás tus prácticas.</div>
          </div>

          <!-- Jornada / Horario PPP ★ NUEVO ★ -->
          <div class="col-md-6">
            <label class="form-label">
              <i class="fa fa-clock me-1" style="color:#f59e0b;"></i>
              Jornada / Horario de Prácticas
            </label>
            <input type="text" name="jornada_horario" class="form-control"
                   value="<?= htmlspecialchars($practica['jornada_horario'] ?? '') ?>"
                   placeholder="Ej: Lunes a Viernes 08:00 - 14:00">
            <div class="readonly-note">
              <?php if (empty($practica)): ?>
                <span style="color:#ef4444;">⚠ Debes tener una práctica activa para guardar este campo.</span>
              <?php else: ?>
                Se guarda en tu práctica activa. Máx. 6 horas diarias según reglamento.
              <?php endif; ?>
            </div>
          </div>

          <!-- Discapacidad -->
          <div class="col-md-4">
            <label class="form-label">¿Tiene Discapacidad?</label>
            <select name="tiene_discapacidad" class="form-select" id="selDisc">
              <option value="no" <?= ($me['tiene_discapacidad']??'no')==='no'?'selected':'' ?>>No</option>
              <option value="si" <?= ($me['tiene_discapacidad']??'no')==='si'?'selected':'' ?>>Sí</option>
            </select>
          </div>
          <div class="col-md-4" id="rowPdisc"
               style="<?= ($me['tiene_discapacidad']??'no')==='si'?'':'display:none;' ?>">
            <label class="form-label">% de Discapacidad</label>
            <input type="number" name="porcentaje_discapacidad" class="form-control"
                   min="0" max="100"
                   value="<?= htmlspecialchars($me['porcentaje_discapacidad'] ?? '') ?>"
                   placeholder="0 - 100">
          </div>

          <!-- Acceso a Internet -->
          <div class="col-md-4">
            <label class="form-label">Acceso a Internet</label>
            <select name="acceso_internet" class="form-select">
              <option value="si" <?= ($me['acceso_internet']??'no')==='si'?'selected':'' ?>>Sí</option>
              <option value="no" <?= ($me['acceso_internet']??'no')==='no'?'selected':'' ?>>No</option>
            </select>
          </div>

          <!-- Dispositivos Tecnológicos -->
          <div class="col-md-12">
            <label class="form-label">Dispositivos Tecnológicos</label>
            <input type="text" name="dispositivos_tecnologicos" class="form-control"
                   value="<?= htmlspecialchars($me['dispositivos_tecnologicos'] ?? '') ?>"
                   placeholder="celular, laptop, tablet...">
            <div class="readonly-note">Separa con comas si tienes varios.</div>
          </div>

          <!-- ══ Croquis / Google Maps ★ NUEVO ★ ══════════════════════════ -->
          <div class="col-12">
            <label class="form-label">
              <i class="fa fa-map-location-dot me-1" style="color:#ef4444;"></i>
              Croquis de domicilio (Google Maps)
            </label>
            <div class="input-group">
              <span class="input-group-text" style="background:#f8fafc;">
                <i class="fa fa-map-pin" style="color:#ef4444;"></i>
              </span>
              <input type="url" name="ubicacion_maps" id="inputMaps" class="form-control"
                     value="<?= htmlspecialchars($me['ubicacion_maps'] ?? '') ?>"
                     placeholder="https://maps.app.goo.gl/... pega el enlace de Google Maps">
              <?php if (!empty($me['ubicacion_maps'])): ?>
              <a href="<?= htmlspecialchars($me['ubicacion_maps']) ?>" target="_blank"
                 class="btn btn-outline-danger btn-sm" title="Ver en Google Maps">
                <i class="fa fa-up-right-from-square me-1"></i>Ver mapa
              </a>
              <?php endif; ?>
            </div>
            <div class="maps-help">
              📍 <strong>Cómo obtener el enlace:</strong> abre
              <a href="https://maps.google.com" target="_blank">Google Maps</a>
              → busca tu dirección → toca el punto → <strong>Compartir</strong>
              → <strong>Copiar enlace</strong> → pégalo aquí.
            </div>

            <!-- Tarjeta de vista previa cuando ya hay URL guardada -->
            <?php $mapsUrl = trim($me['ubicacion_maps'] ?? ''); if ($mapsUrl): ?>
            <div id="mapsPreviewBox"
                 style="margin-top:10px;border:1px solid #e5e7eb;border-radius:10px;
                        padding:14px 16px;background:#f8fafc;display:flex;
                        align-items:center;gap:14px;">
              <div style="font-size:28px;line-height:1;">📍</div>
              <div style="flex:1;min-width:0;">
                <div style="font-size:13px;font-weight:600;color:#1e293b;margin-bottom:2px;">
                  Ubicación de domicilio registrada
                </div>
                <div style="font-size:11px;color:#64748b;white-space:nowrap;overflow:hidden;
                            text-overflow:ellipsis;max-width:500px;">
                  <?= htmlspecialchars($mapsUrl) ?>
                </div>
              </div>
              <a href="<?= htmlspecialchars($mapsUrl) ?>" target="_blank"
                 class="btn btn-danger btn-sm" style="white-space:nowrap;flex-shrink:0;">
                <i class="fa fa-map me-1"></i>Abrir en Google Maps
              </a>
            </div>
            <?php endif; ?>
          </div>
          <!-- ════════════════════════════════════════════════════════════ -->

          <div class="col-12 pt-1">
            <button type="submit" class="btn btn-primary btn-sm px-4">
              <i class="fa fa-save me-1"></i>Guardar datos personales
            </button>
          </div>
        </div>
      </form>
    </div>

    <!-- ── DATOS ACADÉMICOS (solo lectura) ────────────────────── -->
    <div class="section-card">
      <div class="section-title"><i class="fa fa-graduation-cap me-2"></i>Datos Académicos</div>
      <div class="row g-3">
        <div class="col-md-4">
          <label class="form-label">Carrera</label>
          <input class="form-control" value="<?= htmlspecialchars($u['carrera_nombre']) ?>" disabled>
        </div>
        <div class="col-md-4">
          <label class="form-label">Código Estudiantil</label>
          <input class="form-control" value="<?= htmlspecialchars($u['codigo_estudiante']) ?>" disabled>
        </div>
        <div class="col-md-4">
          <label class="form-label">Semestre Actual</label>
          <input class="form-control"
                 value="<?= $u['semestre_actual'] ? $u['semestre_actual'].'° Nivel' : '—' ?>" disabled>
        </div>
        <div class="col-md-6">
          <label class="form-label">Período de Ingreso</label>
          <input class="form-control" value="<?= htmlspecialchars($u['periodo_nombre'] ?? '—') ?>" disabled>
        </div>
      </div>
      <div class="readonly-note mt-2">Los datos académicos solo pueden ser modificados por el coordinador o administrador.</div>
    </div>

    <!-- ══════════════════════════════════════════════════════════════════ -->
    <!-- ── FICHA PPP ────────────────────────────────────────────────── -->
    <!-- ══════════════════════════════════════════════════════════════════ -->
    <div class="section-card">
      <div class="section-title">
        <i class="fa fa-file-pdf me-2" style="color:#ef4444;"></i>
        Ficha de Prácticas Pre Profesionales (ISTT-PPP-002A)
      </div>

      <?php if (empty($fichasPPP)): ?>
        <div style="text-align:center;padding:24px;color:#9ca3af;">
          <i class="fa fa-folder-open fa-2x mb-2 d-block" style="color:#d1d5db;"></i>
          No tienes prácticas registradas aún.
        </div>

      <?php else: ?>
        <!-- Instrucciones -->
        <div style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;
             padding:12px 14px;font-size:12px;color:#1e40af;margin-bottom:16px;">
          <i class="fa fa-circle-info me-2"></i>
          <strong>Pasos:</strong>
          ① Descarga el PDF de tu ficha →
          ② Imprímelo y fírmalo a mano →
          ③ Escanéalo o fotografíalo →
          ④ Súbelo aquí firmado ✅
        </div>

        <?php
        // Badge helper inline
        $bfp = function(string $e): string {
            return match($e) {
                'enviada'       => '<span class="badge-fp badge-fp-env">📤 Descarga, firma y sube</span>',
                'firmada_est'   => '<span class="badge-fp badge-fp-est">⏳ Esperando firma del coordinador</span>',
                'firmada_final' => '<span class="badge-fp badge-fp-ok">✅ Firmada y completa</span>',
                default         => '<span class="badge-fp badge-fp-none">📄 Descarga disponible — pendiente de habilitar subida</span>',
            };
        };
        foreach ($fichasPPP as $fp):
            $fe     = $fp['ficha_estado'] ?? 'no_enviada';
            $idPrac = $fp['id_practica'];
        ?>
        <div class="ficha-ppp-card">

          <!-- Cabecera -->
          <div class="ficha-ppp-head">
            <div>
              <span style="font-size:12px;font-weight:700;color:#991b1b;">
                <i class="fa fa-building me-1"></i><?= htmlspecialchars($fp['empresa']) ?>
              </span>
              <span style="font-size:10px;color:#9ca3af;margin-left:8px;">
                Práctica #<?= $idPrac ?>
                · <?= $fp['fecha_inicio'] ? date('d/m/Y', strtotime($fp['fecha_inicio'])) : '—' ?>
                al <?= $fp['fecha_fin']   ? date('d/m/Y', strtotime($fp['fecha_fin']))   : '—' ?>
              </span>
            </div>
            <?= $bfp($fe) ?>
          </div>

          <!-- Cuerpo -->
          <div class="ficha-ppp-body">

            <?php if ($fe === 'no_enviada'): ?>
            <!-- ── PENDIENTE: PDF siempre visible, subida aún no habilitada ── -->
            <div class="row g-3">
              <!-- Siempre puede descargar -->
              <div class="col-md-5">
                <p style="font-size:11px;font-weight:700;color:#374151;margin-bottom:6px;">
                  <span style="background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:4px;">PASO 1</span>
                  &nbsp;Descarga e imprime tu ficha
                </p>
                <a href="<?= BASE_URL ?>/modules/estudiante/generar_ficha_ppp.php?id=<?= $idPrac ?>"
                   target="_blank" class="btn-fp-pdf">
                  <i class="fa fa-file-pdf"></i> Descargar / Imprimir PDF
                </a>
              </div>
              <!-- Subida bloqueada hasta que coordinador habilite -->
              <div class="col-md-7">
                <p style="font-size:11px;font-weight:700;color:#374151;margin-bottom:6px;">
                  <span style="background:#f3f4f6;color:#6b7280;padding:2px 8px;border-radius:4px;">PASO 2</span>
                  &nbsp;Subida de ficha firmada
                </p>
                <div style="background:#f9fafb;border:1px dashed #d1d5db;border-radius:8px;
                     padding:14px;text-align:center;color:#9ca3af;font-size:12px;">
                  <i class="fa fa-clock me-1"></i>
                  Descarga el PDF, fírmalo e imprímelo. Cuando el coordinador habilite la subida,
                  aparecerá aquí el botón para enviarlo firmado.
                </div>
              </div>
            </div>

            <?php elseif ($fe === 'enviada'): ?>
            <!-- ── HABILITADA: descargar + subir ─────────────────────── -->
            <div class="row g-3">
              <!-- PASO 1: Descargar -->
              <div class="col-md-5">
                <p style="font-size:11px;font-weight:700;color:#374151;margin-bottom:6px;">
                  <span style="background:#fee2e2;color:#991b1b;padding:2px 8px;border-radius:4px;">PASO 1</span>
                  &nbsp;Descarga e imprime tu ficha
                </p>
                <a href="<?= BASE_URL ?>/modules/estudiante/generar_ficha_ppp.php?id=<?= $idPrac ?>"
                   target="_blank" class="btn-fp-pdf">
                  <i class="fa fa-file-pdf"></i> Descargar / Imprimir PDF
                </a>
                <div style="font-size:10px;color:#9ca3af;margin-top:6px;">
                  📅 Habilitada:
                  <?= $fp['ficha_enviada_at'] ? date('d/m/Y H:i', strtotime($fp['ficha_enviada_at'])) : '—' ?>
                </div>
              </div>
              <!-- PASO 2: Subir firmada -->
              <div class="col-md-7">
                <p style="font-size:11px;font-weight:700;color:#374151;margin-bottom:6px;">
                  <span style="background:#dbeafe;color:#1e40af;padding:2px 8px;border-radius:4px;">PASO 2</span>
                  &nbsp;Sube tu ficha firmada (PDF, JPG o PNG)
                </p>
                <form method="POST"
                      action="<?= BASE_URL ?>/modules/estudiante/accion_ficha_est.php"
                      enctype="multipart/form-data"
                      id="formFicha_<?= $idPrac ?>">
                  <input type="hidden" name="accion"       value="upload_est">
                  <input type="hidden" name="id_practica"  value="<?= $idPrac ?>">
                  <div class="upload-drop" onclick="document.getElementById('ffile_<?= $idPrac ?>').click()">
                    <input type="file" id="ffile_<?= $idPrac ?>" name="ficha_firmada"
                           accept=".pdf,.jpg,.jpeg,.png" required
                           onchange="showName(this,<?= $idPrac ?>)">
                    <i class="fa fa-cloud-arrow-up" style="font-size:20px;color:#93c5fd;"></i>
                    <div style="font-size:12px;font-weight:600;color:#1e40af;margin-top:4px;">
                      Haz clic o arrastra tu archivo aquí
                    </div>
                    <div id="fname_<?= $idPrac ?>" style="font-size:10px;color:#6b7280;margin-top:4px;">
                      Ningún archivo seleccionado
                    </div>
                  </div>
                  <button type="submit" class="btn-fp-up mt-2"
                          onclick="return confirm('¿Confirmas enviar tu ficha firmada?')">
                    <i class="fa fa-paper-plane"></i> Enviar ficha firmada al coordinador
                  </button>
                </form>
              </div>
            </div>

            <?php elseif ($fe === 'firmada_est'): ?>
            <!-- ── FIRMADA POR ESTUDIANTE ─────────────────────────────── -->
            <div class="row g-3 align-items-center">
              <div class="col-md-6">
                <div style="background:#fefce8;border:1px solid #fde68a;border-radius:8px;padding:14px;">
                  <p style="font-size:13px;font-weight:700;color:#a16207;margin-bottom:4px;">
                    ⏳ Tu ficha fue recibida correctamente
                  </p>
                  <p style="font-size:12px;color:#6b7280;margin:0;">
                    El coordinador revisará y agregará la firma de la autoridad. Recibirás el documento final aquí.
                  </p>
                </div>
              </div>
              <div class="col-md-6">
                <p style="font-size:11px;color:#9ca3af;margin-bottom:6px;">
                  ¿Necesitas corregir el archivo que subiste?
                </p>
                <form method="POST"
                      action="<?= BASE_URL ?>/modules/estudiante/accion_ficha_est.php"
                      enctype="multipart/form-data">
                  <input type="hidden" name="accion"       value="upload_est">
                  <input type="hidden" name="id_practica"  value="<?= $idPrac ?>">
                  <div class="d-flex gap-2 align-items-center flex-wrap">
                    <input type="file" name="ficha_firmada" accept=".pdf,.jpg,.jpeg,.png"
                           class="form-control form-control-sm" style="max-width:200px;" required>
                    <button type="submit" class="btn-fp-up" style="font-size:11px;padding:6px 12px;"
                            onclick="return confirm('¿Reemplazar la ficha enviada?')">
                      <i class="fa fa-rotate"></i> Reemplazar
                    </button>
                  </div>
                </form>
              </div>
            </div>

            <?php elseif ($fe === 'firmada_final'): ?>
            <!-- ── PROCESO COMPLETO ──────────────────────────────────── -->
            <div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:16px;">
              <div class="d-flex align-items-center gap-3 flex-wrap">
                <span style="font-size:32px;">🎉</span>
                <div style="flex:1;">
                  <p style="font-size:13px;font-weight:700;color:#15803d;margin-bottom:4px;">
                    ¡Tu ficha está firmada por ambas partes!
                  </p>
                  <p style="font-size:12px;color:#6b7280;margin-bottom:10px;">
                    Guarda este documento como comprobante oficial de tus prácticas.
                  </p>
                  <?php
                    // Resolver URL del PDF firmado final (OneDrive o local)
                    $urlFichaFinal = null;
                    if (!empty($fp['ficha_doc_final'])) {
                        if (OneDriveStorage::esOneDrive($fp['ficha_doc_final'])) {
                            $urlFichaFinal = OneDriveStorage::getDownloadUrl($fp['ficha_doc_final']);
                        } else {
                            $urlFichaFinal = UPLOAD_URL . '/' . ltrim($fp['ficha_doc_final'], '/');
                        }
                    }
                  ?>
                  <?php if ($urlFichaFinal): ?>
                  <a href="<?= htmlspecialchars($urlFichaFinal) ?>"
                     target="_blank" class="btn-fp-dl" download>
                    <i class="fa fa-download"></i> Descargar Ficha Firmada Final
                  </a>
                  <?php else: ?>
                  <span style="color:#9ca3af;font-size:12px;">Documento no disponible temporalmente.</span>
                  <?php endif; ?>
                </div>
              </div>
            </div>
            <?php endif; ?>

          </div><!-- /ficha-ppp-body -->
        </div><!-- /ficha-ppp-card -->
        <?php endforeach; ?>
      <?php endif; ?>
    </div><!-- /section-card ficha -->

  </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>
// Mostrar/ocultar campo de porcentaje discapacidad
$('#selDisc').on('change', function(){
    $('#rowPdisc').toggle(this.value === 'si');
});

// Mostrar nombre de archivo seleccionado en ficha PPP
function showName(input, id) {
    var el = document.getElementById('fname_' + id);
    if (!el) return;
    if (input.files && input.files[0]) {
        var f = input.files[0];
        var mb = (f.size / 1024 / 1024).toFixed(2);
        el.innerHTML = '📎 <strong>' + f.name + '</strong> (' + mb + ' MB)';
        el.style.color = '#1e40af';
        if (f.size > 10 * 1024 * 1024) {
            alert('⚠ El archivo es demasiado grande (máx. 10 MB).');
            input.value = '';
            el.innerHTML = 'Ningún archivo seleccionado';
            el.style.color = '#6b7280';
        }
    }
}

// Drag & drop en zonas de upload
document.querySelectorAll('.upload-drop').forEach(function(zone) {
    zone.addEventListener('dragover', function(e) {
        e.preventDefault();
        zone.style.borderColor = '#3b82f6';
        zone.style.background  = '#dbeafe';
    });
    zone.addEventListener('dragleave', function() {
        zone.style.borderColor = '#93c5fd';
        zone.style.background  = '#f8fbff';
    });
    zone.addEventListener('drop', function(e) {
        e.preventDefault();
        zone.style.borderColor = '#93c5fd';
        zone.style.background  = '#f8fbff';
        var input = zone.querySelector('input[type=file]');
        if (input && e.dataTransfer.files[0]) {
            // Asignar via DataTransfer
            var dt = new DataTransfer();
            dt.items.add(e.dataTransfer.files[0]);
            input.files = dt.files;
            var id = input.id.replace('ffile_', '');
            showName(input, id);
        }
    });
});

// Vista previa de Maps: mostrar tarjeta al pegar URL
$('#inputMaps').on('change blur', function(){
    var url = $.trim(this.value);
    var box = $('#mapsPreviewBox');
    if (!url) { box.hide(); return; }
    if (!box.length) {
        $(this).closest('.col-12').append(
            '<div id="mapsPreviewBox" style="margin-top:10px;border:1px solid #e5e7eb;' +
            'border-radius:10px;padding:14px 16px;background:#f8fafc;' +
            'display:flex;align-items:center;gap:14px;">' +
            '<div style="font-size:28px;">📍</div>' +
            '<div style="flex:1;min-width:0;">' +
              '<div style="font-size:13px;font-weight:600;color:#1e293b;margin-bottom:2px;">Ubicación de domicilio registrada</div>' +
              '<div class="maps-url-txt" style="font-size:11px;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:500px;"></div>' +
            '</div>' +
            '<a class="maps-open-btn btn btn-danger btn-sm" target="_blank" style="white-space:nowrap;flex-shrink:0;">' +
              '<i class="fa fa-map me-1"></i>Abrir en Google Maps</a>' +
            '</div>'
        );
        box = $('#mapsPreviewBox');
    }
    box.find('.maps-url-txt').text(url);
    box.find('.maps-open-btn').attr('href', url);
    box.show();
});
</script>
</body></html>