<?php
// modules/estudiante/bitacoras.php
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config'   . DIRECTORY_SEPARATOR . 'app.php';
require_once __DIR__ . '/../../config/onedrive.php';
require_once __DIR__ . '/../../includes/OneDriveStorage.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'auth.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'functions.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'flash.php';
requireRol(ROL_ESTUDIANTE);

$idInstituto = (int)($user['id_instituto'] ?? 0);

// ── Validación segura de archivos (3 capas) ──────────────────
// Capa 1: extensión del nombre
// Capa 2: MIME type real con finfo (lee bytes internos, ignora el nombre)
// Capa 3: magic bytes — firma hexadecimal real al inicio del archivo
// Retorna '' si pasa todo, o mensaje de error si falla alguna capa.
if (!function_exists('validarArchivoSeguro')) {
    function validarArchivoSeguro(array $file, array $extsOk, array $mimesOk, array $magicOk): string
    {
        $ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
        if (!in_array($ext, $extsOk))
            return 'Extensión no permitida. Solo se aceptan: ' . strtoupper(implode(', ', $extsOk)) . '.';

        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).';
        }

        $fh = fopen($file['tmp_name'], 'rb');
        if ($fh === false) return 'No se pudo leer el archivo temporalmente.';
        $cabecera = fread($fh, max(array_column($magicOk, 'len')));
        fclose($fh);

        foreach ($magicOk as $firma)
            if (substr($cabecera, 0, $firma['len']) === $firma['bytes']) return '';

        return 'El archivo no tiene la firma interna correcta. Puede ser una imagen falsa con extensión cambiada.';
    }
}

if (!defined('MAGIC_BIT')) {
    define('MAGIC_BIT', [
        'jpg'  => ['bytes' => "\xFF\xD8\xFF", 'len' => 3],
        'jpeg' => ['bytes' => "\xFF\xD8\xFF", 'len' => 3],
        'png'  => ['bytes' => "\x89PNG",      'len' => 4],
        'webp' => ['bytes' => "RIFF",         'len' => 4], // WEBP siempre empieza con RIFF
    ]);
}

$user = currentUser();
$db   = getDB();
$pageTitle = 'Bitácoras';

// ── Práctica activa del estudiante ───────────────────────────
$st = $db->prepare("
    SELECT pr.id_practica, pr.horas_requeridas, pr.horas_cumplidas,
           pr.estado, pr.fecha_inicio, pr.fecha_fin
    FROM practicas pr
    JOIN estudiantes e ON e.id_estudiante = pr.id_estudiante
    JOIN periodos_academicos pe ON pe.id_periodo = pr.id_periodo
    WHERE e.id_usuario = :u
      AND pr.estado IN ('aprobado','en_progreso','informe_enviado')
      AND pe.activo = 1
    ORDER BY pr.created_at DESC LIMIT 1
");
$st->execute([':u' => $user['id']]);
$practica = $st->fetch();

// ═══════════════════════════════════════════════════════════════
//  POST — acciones
// ═══════════════════════════════════════════════════════════════
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $practica) {
    $accion = $_POST['accion'] ?? '';

    // ── 1. Crear nueva semana (borrador) ─────────────────────
    if ($accion === 'crear_semana') {
        $semana = (int)($_POST['semana_numero'] ?? 0);
        $fi     = $_POST['fecha_inicio_semana'] ?? '';
        $ff     = $_POST['fecha_fin_semana']    ?? '';

        // Verificar que no exista ya
        $existe = $db->prepare("SELECT id_bitacora FROM bitacoras WHERE id_practica=:p AND semana_numero=:s");
        $existe->execute([':p' => $practica['id_practica'], ':s' => $semana]);

        if ($existe->fetch()) {
            flashSet('warn', 'La semana ' . $semana . ' ya existe. Selecciónala para agregar actividades.');
        } elseif ($semana && $fi && $ff) {
            $db->prepare("
                INSERT INTO bitacoras
                    (id_practica, semana_numero, fecha_inicio_semana, fecha_fin_semana,
                     horas_semana, actividades, estado)
                VALUES (:p, :s, :fi, :ff, 0, '[]', 'borrador')
            ")->execute([
                ':p'  => $practica['id_practica'],
                ':s'  => $semana,
                ':fi' => $fi,
                ':ff' => $ff,
            ]);
            flashSet('ok', 'Semana ' . $semana . ' creada. Ahora puedes registrar tus actividades diarias.');
        }
        header('Location: bitacoras.php'); exit;
    }

    // ── 2. Agregar entrada diaria ────────────────────────────
    if ($accion === 'agregar_dia') {
        $idBit  = (int)($_POST['id_bitacora'] ?? 0);
        $fecha  = $_POST['fecha_dia']    ?? '';
        $horas  = (int)($_POST['horas_dia'] ?? 0);
        $desc   = trim($_POST['descripcion_dia'] ?? '');
        $logros = trim($_POST['logros_dia']      ?? '');
        $dif    = trim($_POST['dificultades_dia'] ?? '');

        if ($idBit && $fecha && $horas >= 0 && $desc) {
            // Cargar bitácora actual
            $bit = $db->prepare("SELECT * FROM bitacoras WHERE id_bitacora=:id AND id_practica=:p AND estado IN ('borrador','observada')");
            $bit->execute([':id' => $idBit, ':p' => $practica['id_practica']]);
            $bit = $bit->fetch();

            if ($bit) {
                $dias = json_decode($bit['actividades'] ?: '[]', true);

                // Verificar que no haya ya una entrada para esa fecha
                $yaExiste = array_filter($dias, fn($d) => $d['fecha'] === $fecha);
                if ($yaExiste) {
                    flashSet('warn', 'Ya registraste actividades para el ' . date('d/m/Y', strtotime($fecha)) . '.');
                } else {
                    // ── Manejar foto de evidencia ──────────────────
                    $fotoPath = null;
                    $file = $_FILES['foto_evidencia'] ?? null;
                    if ($file && $file['error'] === UPLOAD_ERR_OK && $file['size'] > 0) {
                        if ($file['size'] > 5 * 1024 * 1024) {
                            flashSet('err', 'La foto no puede superar 5 MB.');
                            header('Location: bitacoras.php?ver=' . $idBit); exit;
                        }
                        // Validación 3 capas: extensión + MIME real + magic bytes
                        $errFoto = validarArchivoSeguro(
                            $file,
                            ['jpg','jpeg','png','webp'],
                            ['image/jpeg','image/png','image/webp'],
                            array_values(MAGIC_BIT)
                        );
                        if ($errFoto) {
                            flashSet('err', $errFoto);
                            header('Location: bitacoras.php?ver=' . $idBit); exit;
                        }
                        $ext     = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
                        $nomFoto = 'bit_' . $idBit . '_' . str_replace('-', '', $fecha) . '_' . time() . '.' . $ext;
                        try {
                            $fotoPath = OneDriveStorage::upload($file['tmp_name'], 'bitacoras', $nomFoto, (string)$idBit, $idInstituto);
                        } catch (Exception $e) { $fotoPath = null; }
                        if($fotoPath) {
                        }
                    }

                    $nuevoDia = [
                        'fecha'        => $fecha,
                        'horas'        => $horas,
                        'descripcion'  => $desc,
                        'logros'       => $logros,
                        'dificultades' => $dif,
                    ];
                    if ($fotoPath) $nuevoDia['foto'] = $fotoPath;

                    $dias[] = $nuevoDia;
                    // Ordenar por fecha
                    usort($dias, fn($a, $b) => strcmp($a['fecha'], $b['fecha']));

                    $totalHoras = array_sum(array_column($dias, 'horas'));

                    $db->prepare("
                        UPDATE bitacoras
                        SET actividades  = :act,
                            horas_semana = :h,
                            updated_at   = NOW()
                        WHERE id_bitacora = :id
                    ")->execute([
                        ':act' => json_encode($dias, JSON_UNESCAPED_UNICODE),
                        ':h'   => $totalHoras,
                        ':id'  => $idBit,
                    ]);
                    flashSet('ok', 'Actividad del ' . date('d/m/Y', strtotime($fecha)) . ' registrada.');
                }
            } else {
                flashSet('warn', 'No puedes editar una bitácora ya enviada o validada.');
            }
        }
        header('Location: bitacoras.php?ver=' . $idBit); exit;
    }

    // ── 3. Editar día existente ──────────────────────────────
    if ($accion === 'editar_dia') {
        $idBit  = (int)($_POST['id_bitacora'] ?? 0);
        $fecha  = $_POST['fecha_dia']         ?? '';
        $horas  = (int)($_POST['horas_dia']   ?? 0);
        $desc   = trim($_POST['descripcion_dia']  ?? '');
        $logros = trim($_POST['logros_dia']        ?? '');
        $dif    = trim($_POST['dificultades_dia']  ?? '');

        $bit = $db->prepare("SELECT * FROM bitacoras WHERE id_bitacora=:id AND id_practica=:p AND estado IN ('borrador','observada')");
        $bit->execute([':id' => $idBit, ':p' => $practica['id_practica']]);
        $bit = $bit->fetch();

        if ($bit && $fecha && $horas >= 0 && $desc) {
            $dias = json_decode($bit['actividades'] ?: '[]', true);

            // Foto nueva (opcional — reemplaza la existente si se sube)
            $fotoPath = null;
            $file = $_FILES['foto_evidencia'] ?? null;
            if ($file && $file['error'] === UPLOAD_ERR_OK && $file['size'] > 0) {
                if ($file['size'] > 5 * 1024 * 1024) {
                    flashSet('err', 'La foto no puede superar 5 MB.');
                    header('Location: bitacoras.php?ver=' . $idBit); exit;
                }
                $errFoto = validarArchivoSeguro(
                    $file,
                    ['jpg','jpeg','png','webp'],
                    ['image/jpeg','image/png','image/webp'],
                    array_values(MAGIC_BIT)
                );
                if ($errFoto) {
                    flashSet('err', $errFoto);
                    header('Location: bitacoras.php?ver=' . $idBit); exit;
                }
                $ext      = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
                $nomFoto  = 'bit_' . $idBit . '_' . str_replace('-', '', $fecha) . '_' . time() . '.' . $ext;
                try {
                    $fotoPath = OneDriveStorage::upload($file['tmp_name'], 'bitacoras', $nomFoto, (string)$idBit, $idInstituto);
                } catch (Exception $e) { $fotoPath = null; }
            }

            // Actualizar el día correspondiente en el JSON
            foreach ($dias as &$d) {
                if ($d['fecha'] === $fecha) {
                    $d['horas']        = $horas;
                    $d['descripcion']  = $desc;
                    $d['logros']       = $logros;
                    $d['dificultades'] = $dif;
                    if ($fotoPath) $d['foto'] = $fotoPath; // solo reemplaza si subió foto nueva
                    break;
                }
            }
            unset($d);

            $totalHoras = array_sum(array_column($dias, 'horas'));
            $db->prepare("
                UPDATE bitacoras
                SET actividades  = :act,
                    horas_semana = :h,
                    updated_at   = NOW()
                WHERE id_bitacora = :id
            ")->execute([
                ':act' => json_encode($dias, JSON_UNESCAPED_UNICODE),
                ':h'   => $totalHoras,
                ':id'  => $idBit,
            ]);
            flashSet('ok', 'Día del ' . date('d/m/Y', strtotime($fecha)) . ' actualizado correctamente.');
        } else {
            flashSet('warn', 'No se pudo actualizar. Verifica que la bitácora esté en borrador.');
        }
        header('Location: bitacoras.php?ver=' . $idBit); exit;
    }

    // ── 4. Eliminar día ──────────────────────────────────────
    if ($accion === 'eliminar_dia') {
        $idBit = (int)($_POST['id_bitacora'] ?? 0);
        $fecha = $_POST['fecha_dia'] ?? '';

        $bit = $db->prepare("SELECT * FROM bitacoras WHERE id_bitacora=:id AND id_practica=:p AND estado='borrador'");
        $bit->execute([':id' => $idBit, ':p' => $practica['id_practica']]);
        $bit = $bit->fetch();

        if ($bit && $fecha) {
            $dias = json_decode($bit['actividades'] ?: '[]', true);
            $dias = array_values(array_filter($dias, fn($d) => $d['fecha'] !== $fecha));
            $totalHoras = array_sum(array_column($dias, 'horas'));
            $db->prepare("UPDATE bitacoras SET actividades=:act, horas_semana=:h WHERE id_bitacora=:id")
               ->execute([':act' => json_encode($dias, JSON_UNESCAPED_UNICODE), ':h' => $totalHoras, ':id' => $idBit]);
            flashSet('ok', 'Entrada eliminada.');
        }
        header('Location: bitacoras.php?ver=' . $idBit); exit;
    }

    // ── 4. Enviar al tutor ───────────────────────────────────
    if ($accion === 'enviar_tutor') {
        $idBit = (int)($_POST['id_bitacora'] ?? 0);

        $bit = $db->prepare("SELECT * FROM bitacoras WHERE id_bitacora=:id AND id_practica=:p AND estado IN ('borrador','observada')");
        $bit->execute([':id' => $idBit, ':p' => $practica['id_practica']]);
        $bit = $bit->fetch();

        if ($bit) {
            $dias = json_decode($bit['actividades'] ?: '[]', true);
            if (empty($dias)) {
                flashSet('warn', 'Debes registrar al menos un día de actividades antes de enviar.');
            } else {
                $db->prepare("UPDATE bitacoras SET estado='enviada', updated_at=NOW() WHERE id_bitacora=:id")
                   ->execute([':id' => $idBit]);

                // Actualizar horas cumplidas en la práctica
                $db->prepare("
                    UPDATE practicas SET
                        horas_cumplidas = (SELECT COALESCE(SUM(horas_semana),0) FROM bitacoras WHERE id_practica=:p AND estado IN ('enviada','validada')),
                        estado = CASE WHEN estado='aprobado' THEN 'en_progreso' ELSE estado END
                    WHERE id_practica=:p2
                ")->execute([':p' => $practica['id_practica'], ':p2' => $practica['id_practica']]);

                flashSet('ok', 'Bitácora enviada al tutor para validación.');
            }
        }
        header('Location: bitacoras.php'); exit;
    }
}

// ── Cargar todas las bitácoras ───────────────────────────────
$listaBit = [];
if ($practica) {
    $q = $db->prepare("
        SELECT b.*,
               CONCAT(u.apellidos,' ',u.nombres) AS tutor_nombre
        FROM bitacoras b
        LEFT JOIN practicas p  ON p.id_practica = b.id_practica
        LEFT JOIN tutores t    ON t.id_tutor     = p.id_tutor
        LEFT JOIN usuarios u   ON u.id_usuario   = t.id_usuario
        WHERE b.id_practica = :p
        ORDER BY b.semana_numero DESC
    ");
    $q->execute([':p' => $practica['id_practica']]);
    $listaBit = $q->fetchAll();
}

// Semana actualmente abierta para ver/editar
$verBit   = null;
$diasBit  = [];
$idVer    = (int)($_GET['ver'] ?? 0);
if ($idVer && $practica) {
    $qv = $db->prepare("SELECT * FROM bitacoras WHERE id_bitacora=:id AND id_practica=:p");
    $qv->execute([':id' => $idVer, ':p' => $practica['id_practica']]);
    $verBit = $qv->fetch();
    if ($verBit) {
        $diasBit = json_decode($verBit['actividades'] ?: '[]', true);
    }
}

// Siguiente número de semana
$numerosUsados = array_column($listaBit, 'semana_numero');
$nuevaSemana   = $numerosUsados ? max($numerosUsados) + 1 : 1;

// Fechas sugeridas de la nueva semana (lunes próximo)
$hoy       = new DateTime();
$diaSemana = (int)$hoy->format('N'); // 1=lunes
$lunesProx = (clone $hoy)->modify('+' . (8 - $diaSemana) . ' days');
if ($diaSemana === 1) $lunesProx = clone $hoy;
$viernesProx = (clone $lunesProx)->modify('+4 days');
?>
<?php $paginaActual = 'bitacoras'; ?>
<!DOCTYPE html>
<html lang="es">
<head><?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'head.php'; ?>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar.css">
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-estudiante.css">
</head>
<body>
<?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . '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">

    <?php if ($verBit): ?>
    <!-- ═══════════════════════════════════════════════════════
         VISTA DETALLE DE UNA SEMANA
    ═══════════════════════════════════════════════════════ -->
    <div class="page-header d-flex justify-content-between align-items-center">
      <div>
        <a href="bitacoras.php" style="font-size:12px; color:var(--text-2); text-decoration:none;">
          <i class="fa fa-arrow-left me-1"></i>Volver a bitácoras
        </a>
        <h4 class="mt-1">Semana <?= $verBit['semana_numero'] ?>
          <span style="font-size:14px; font-weight:400; color:var(--text-2);">
            · <?= formatFecha($verBit['fecha_inicio_semana']) ?> — <?= formatFecha($verBit['fecha_fin_semana']) ?>
          </span>
        </h4>
        <p><?= $verBit['horas_semana'] ?>h registradas · <?= badgeEstado($verBit['estado']) ?></p>
      </div>
      <div class="d-flex gap-2">
        <?php if (in_array($verBit['estado'], ['borrador','observada'])): ?>
        <button class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modalDia">
          <i class="fa fa-plus me-1"></i>Registrar día
        </button>
        <form method="POST" class="d-inline" onsubmit="return confirm('¿Enviar esta semana al tutor para validación?')">
          <input type="hidden" name="accion"      value="enviar_tutor">
          <input type="hidden" name="id_bitacora" value="<?= $verBit['id_bitacora'] ?>">
          <button type="submit" class="btn btn-success btn-sm" <?= empty($diasBit) ? 'disabled' : '' ?>>
            <i class="fa fa-paper-plane me-1"></i>Enviar al tutor
          </button>
        </form>
        <?php endif; ?>
      </div>
    </div>

    <?= flashHtml() ?>

    <?php if ($verBit['comentario_tutor']): ?>
    <div class="alert-dark-warn p-3 mb-4">
      <i class="fa fa-comment me-1"></i>
      <strong>Comentario del tutor:</strong> <?= htmlspecialchars($verBit['comentario_tutor']) ?>
    </div>
    <?php endif; ?>

    <?php if (empty($diasBit)): ?>
    <div class="alert-dark-info p-3 mb-4">
      <i class="fa fa-info-circle me-1"></i>
      Aún no has registrado actividades esta semana. Haz clic en <strong>Registrar día</strong> para comenzar.
    </div>
    <?php else: ?>

    <!-- Resumen de horas -->
    <div class="row g-3 mb-4">
      <div class="col-sm-4">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:var(--accent);"><?= count($diasBit) ?></div>
            <div class="stat-label">Días registrados</div>
          </div>
          <div class="stat-icon">📅</div>
        </div>
      </div>
      <div class="col-sm-4">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:var(--green);"><?= $verBit['horas_semana'] ?>h</div>
            <div class="stat-label">Total horas semana</div>
          </div>
          <div class="stat-icon">⏱️</div>
        </div>
      </div>
      <div class="col-sm-4">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:var(--yellow);"><?= round($verBit['horas_semana'] / max(count($diasBit),1), 1) ?>h</div>
            <div class="stat-label">Promedio por día</div>
          </div>
          <div class="stat-icon">📊</div>
        </div>
      </div>
    </div>

    <!-- Tabla de días -->
    <div class="tbl-wrap">
      <table class="table table-borderless mb-0">
        <thead>
          <tr>
            <th>Fecha</th>
            <th style="text-align:center;">Horas</th>
            <th>Actividades realizadas</th>
            <th>Logros</th>
            <th>Dificultades</th>
            <th style="text-align:center;"><i class="fa fa-camera fa-xs"></i> Evidencia</th>
            <?php if (in_array($verBit['estado'], ['borrador','observada'])): ?>
            <th style="text-align:center;">Acciones</th>
            <?php endif; ?>
          </tr>
        </thead>
        <tbody>
          <?php foreach ($diasBit as $dia):
            $esFeriado = (int)$dia['horas'] === 0;
          ?>
          <tr style="<?= $esFeriado ? 'opacity:.65;' : '' ?>">
            <td>
              <strong><?= date('d/m/Y', strtotime($dia['fecha'])) ?></strong>
              <div style="font-size:10px; color:var(--text-2);">
                <?= ['1'=>'Lunes','2'=>'Martes','3'=>'Miércoles','4'=>'Jueves','5'=>'Viernes','6'=>'Sábado','7'=>'Domingo'][date('N', strtotime($dia['fecha']))] ?? '' ?>
              </div>
              <?php if ($esFeriado): ?>
              <span style="font-size:9px;padding:1px 6px;border-radius:4px;
                           background:var(--yellow-lo);color:var(--yellow);
                           border:1px solid rgba(251,191,36,.3);font-weight:700;">
                FERIADO
              </span>
              <?php endif; ?>
            </td>
            <td style="text-align:center; font-weight:700; color:<?= $esFeriado ? 'var(--yellow)' : 'var(--accent)' ?>;">
              <?= $esFeriado ? '—' : $dia['horas'].'h' ?>
            </td>
            <td style="font-size:13px; max-width:280px;"><?= nl2br(htmlspecialchars($dia['descripcion'])) ?></td>
            <td style="font-size:12px; color:var(--green); max-width:160px;">
              <?= $dia['logros'] ? nl2br(htmlspecialchars($dia['logros'])) : '<span style="color:var(--text-2);">—</span>' ?>
            </td>
            <td style="font-size:12px; color:var(--yellow); max-width:160px;">
              <?= $dia['dificultades'] ? nl2br(htmlspecialchars($dia['dificultades'])) : '<span style="color:var(--text-2);">—</span>' ?>
            </td>
            <td style="text-align:center;">
              <?php
                $fotoUrl = null;
                if (!empty($dia['foto'])) {
                    if (OneDriveStorage::esOneDrive($dia['foto'])) {
                        $fotoUrl = OneDriveStorage::getDownloadUrl($dia['foto']);
                    } else {
                        $fotoUrl = UPLOAD_URL . '/' . ltrim($dia['foto'], '/');
                    }
                }
              ?>
              <?php if ($fotoUrl): ?>
              <img src="<?= htmlspecialchars($fotoUrl) ?>"
                   onclick="verFotoEvidencia('<?= htmlspecialchars($fotoUrl) ?>')"
                   style="width:48px;height:48px;object-fit:cover;border-radius:6px;
                          border:1px solid var(--border);cursor:zoom-in;"
                   title="Clic para ampliar">
              <?php else: ?>
              <span style="color:var(--text-2);font-size:11px;">—</span>
              <?php endif; ?>
            </td>
            <?php if (in_array($verBit['estado'], ['borrador','observada'])): ?>
            <td style="text-align:center;">
              <div class="d-flex gap-1 justify-content-center">
                <!-- Editar día -->
                <button type="button"
                        class="btn btn-sm btn-outline-primary btn-editar-dia" title="Editar día"
                        data-fecha="<?= htmlspecialchars($dia['fecha']) ?>"
                        data-horas="<?= (int)$dia['horas'] ?>"
                        data-desc="<?= htmlspecialchars($dia['descripcion'] ?? '', ENT_QUOTES) ?>"
                        data-logros="<?= htmlspecialchars($dia['logros'] ?? '', ENT_QUOTES) ?>"
                        data-dif="<?= htmlspecialchars($dia['dificultades'] ?? '', ENT_QUOTES) ?>"
                        data-id="<?= (int)$verBit['id_bitacora'] ?>"
                        data-foto="<?= htmlspecialchars($fotoUrl ?? '', ENT_QUOTES) ?>">
                  <i class="fa fa-pen"></i>
                </button>
                <!-- Eliminar día -->
                <form method="POST" onsubmit="return confirm('¿Eliminar este día?')" style="margin:0;">
                  <input type="hidden" name="accion"      value="eliminar_dia">
                  <input type="hidden" name="id_bitacora" value="<?= $verBit['id_bitacora'] ?>">
                  <input type="hidden" name="fecha_dia"   value="<?= $dia['fecha'] ?>">
                  <button type="submit" class="btn btn-sm btn-outline-danger" title="Eliminar">
                    <i class="fa fa-trash"></i>
                  </button>
                </form>
              </div>
            </td>
            <?php endif; ?>
          </tr>
          <?php endforeach; ?>
        </tbody>
      </table>
    </div>
    <?php endif; ?>

    <!-- Modal agregar día -->
    <?php if (in_array($verBit['estado'], ['borrador','observada'])): ?>
    <div class="modal fade" id="modalDia" tabindex="-1">
      <div class="modal-dialog modal-lg">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title"><i class="fa fa-calendar-plus me-2"></i>Registrar actividad del día</h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
          </div>
          <form method="POST" enctype="multipart/form-data">
            <input type="hidden" name="accion"      value="agregar_dia">
            <input type="hidden" name="id_bitacora" value="<?= $verBit['id_bitacora'] ?>">
            <div class="modal-body">
              <div class="row g-3">
                <div class="col-sm-6">
                  <label class="form-label">Fecha</label>
                  <input type="date" name="fecha_dia" class="form-control" required
                         min="<?= $verBit['fecha_inicio_semana'] ?>"
                         max="<?= $verBit['fecha_fin_semana'] ?>"
                         value="<?= date('Y-m-d') ?>">
                  <div style="font-size:10px; color:var(--text-2); margin-top:3px;">
                    Solo dentro del período de la semana
                  </div>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Horas trabajadas</label>
                  <input type="number" name="horas_dia" class="form-control" required min="0" max="12" value="8">
                </div>
                <div class="col-12">
                  <label class="form-label">Actividades realizadas <span style="color:var(--red);">*</span></label>
                  <textarea name="descripcion_dia" class="form-control" rows="3" required
                            placeholder="Describe detalladamente qué hiciste hoy..."></textarea>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Logros del día</label>
                  <textarea name="logros_dia" class="form-control" rows="2"
                            placeholder="¿Qué lograste hoy?"></textarea>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Dificultades encontradas</label>
                  <textarea name="dificultades_dia" class="form-control" rows="2"
                            placeholder="¿Tuviste alguna dificultad?"></textarea>
                </div>
                <!-- Foto de evidencia -->
                <div class="col-12">
                  <label class="form-label">
                    <i class="fa fa-camera me-1" style="color:var(--accent);"></i>
                    Foto de evidencia
                    <small style="color:var(--text-2);font-weight:400;">(opcional · JPG, PNG · máx. 5 MB)</small>
                  </label>
                  <input type="file" name="foto_evidencia" class="form-control"
                         accept=".jpg,.jpeg,.png,.webp" id="inputFotoEvidencia">
                  <div id="previewFoto" style="display:none;margin-top:8px;">
                    <img id="imgPreview" src="" alt="Vista previa"
                         style="max-height:120px;border-radius:8px;border:1px solid var(--border);">
                  </div>
                </div>
              </div>
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancelar</button>
              <button type="submit" class="btn btn-primary"><i class="fa fa-save me-1"></i>Guardar día</button>
            </div>
          </form>
        </div>
      </div>
    </div>

    <!-- Modal editar día -->
    <div class="modal fade" id="modalEditarDia" tabindex="-1">
      <div class="modal-dialog modal-lg">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title"><i class="fa fa-pen me-2"></i>Editar actividad del día</h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
          </div>
          <form method="POST" enctype="multipart/form-data">
            <input type="hidden" name="accion"      value="editar_dia">
            <input type="hidden" name="id_bitacora" id="edit_id_bitacora" value="">
            <div class="modal-body">
              <div class="row g-3">
                <div class="col-sm-6">
                  <label class="form-label">Fecha</label>
                  <input type="date" name="fecha_dia" id="edit_fecha" class="form-control" readonly>
                  <div style="font-size:10px;color:var(--text-2);margin-top:3px;">
                    La fecha no se puede cambiar. Elimina y vuelve a crear si necesitas otra fecha.
                  </div>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Horas trabajadas</label>
                  <input type="number" name="horas_dia" id="edit_horas" class="form-control" required min="0" max="12">
                </div>
                <div class="col-12">
                  <label class="form-label">Actividades realizadas <span style="color:var(--red);">*</span></label>
                  <textarea name="descripcion_dia" id="edit_descripcion" class="form-control" rows="3" required></textarea>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Logros del día</label>
                  <textarea name="logros_dia" id="edit_logros" class="form-control" rows="2"></textarea>
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Dificultades encontradas</label>
                  <textarea name="dificultades_dia" id="edit_dificultades" class="form-control" rows="2"></textarea>
                </div>
                <!-- Foto actual + reemplazo -->
                <div class="col-12">
                  <label class="form-label">
                    <i class="fa fa-camera me-1" style="color:var(--accent);"></i>
                    Foto de evidencia
                    <small style="color:var(--text-2);font-weight:400;">(deja vacío para mantener la actual)</small>
                  </label>
                  <div id="edit_foto_actual" style="display:none;margin-bottom:8px;">
                    <p style="font-size:11px;color:var(--text-2);margin-bottom:4px;">Foto actual:</p>
                    <img id="edit_foto_preview" src="" alt="Foto actual"
                         style="max-height:100px;border-radius:8px;border:1px solid var(--border);">
                  </div>
                  <input type="file" name="foto_evidencia" class="form-control"
                         accept=".jpg,.jpeg,.png,.webp" id="editInputFoto">
                </div>
              </div>
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancelar</button>
              <button type="submit" class="btn btn-primary"><i class="fa fa-floppy-disk me-1"></i>Guardar cambios</button>
            </div>
          </form>
        </div>
      </div>
    </div>
    <?php endif; ?>

    <?php else: ?>
    <!-- ═══════════════════════════════════════════════════════
         LISTA DE SEMANAS
    ═══════════════════════════════════════════════════════ -->
    <div class="page-header d-flex justify-content-between align-items-center">
      <div>
        <h4>Bitácoras Semanales</h4>
        <p>Registro de actividades por semana — haz clic en una semana para ver o agregar días</p>
      </div>
      <?php if ($practica): ?>
      <button class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modalSemana">
        <i class="fa fa-plus me-1"></i>Nueva semana
      </button>
      <?php endif; ?>
    </div>

    <?= flashHtml() ?>

    <?php if (!$practica): ?>
    <div class="alert-dark-warn p-3">Necesitas una práctica aprobada para registrar bitácoras.</div>
    <?php else: ?>

    <!-- Progreso de horas -->
    <?php
    $horasCumplidas = $practica['horas_cumplidas'] ?? 0;
    $horasReq       = $practica['horas_requeridas'] ?? 1;
    $pctHoras       = min(100, round($horasCumplidas / $horasReq * 100));
    $pctColor       = $pctHoras >= 80 ? 'var(--green)' : ($pctHoras >= 40 ? 'var(--yellow)' : 'var(--accent)');
    ?>
    <div class="tbl-wrap p-4 mb-4">
      <div style="display:flex; justify-content:space-between; margin-bottom:6px;">
        <span style="font-size:13px; font-weight:600;">Progreso de horas de práctica</span>
        <span style="font-size:13px; font-weight:700; color:<?= $pctColor ?>;">
          <?= $horasCumplidas ?> / <?= $horasReq ?>h (<?= $pctHoras ?>%)
        </span>
      </div>
      <div style="background:var(--border); border-radius:6px; height:10px;">
        <div style="width:<?= $pctHoras ?>%; height:10px; border-radius:6px; background:<?= $pctColor ?>; transition:width .4s;"></div>
      </div>
    </div>

    <div class="tbl-wrap">
      <table class="table table-borderless mb-0">
        <thead>
          <tr>
            <th>Semana</th>
            <th>Período</th>
            <th style="text-align:center;">Días</th>
            <th style="text-align:center;">Horas</th>
            <th>Estado</th>
            <th>Tutor</th>
            <th style="text-align:center;">Acciones</th>
          </tr>
        </thead>
        <tbody>
          <?php if (empty($listaBit)): ?>
          <tr><td colspan="7" class="text-center text-muted py-4">
            Sin bitácoras aún. Crea tu primera semana con el botón <strong>+ Nueva semana</strong>.
          </td></tr>
          <?php else: foreach ($listaBit as $b):
            $diasDecoded = json_decode($b['actividades'] ?: '[]', true);
            $diasCount   = is_array($diasDecoded) ? count($diasDecoded) : 0;
            $editable  = in_array($b['estado'], ['borrador','observada']);
          ?> 
          <tr style="cursor:pointer;" onclick="window.location='bitacoras.php?ver=<?= $b['id_bitacora'] ?>'">
            <td>
              <strong>Semana <?= $b['semana_numero'] ?></strong>
              <?php if ($editable): ?>
              <span style="font-size:9px; padding:2px 6px; border-radius:4px; background:var(--accent-lo);
                           color:var(--accent); font-weight:700; margin-left:4px;">EDITABLE</span>
              <?php endif; ?>
            </td>
            <td style="font-size:12px; color:var(--text-2);">
              <?= formatFecha($b['fecha_inicio_semana']) ?> — <?= formatFecha($b['fecha_fin_semana']) ?>
            </td>
            <td style="text-align:center; font-weight:600; color:var(--accent);"><?= $diasCount ?></td>
            <td style="text-align:center; font-weight:700;"><?= $b['horas_semana'] ?>h</td>
            <td><?= badgeEstado($b['estado']) ?></td>
            <td style="font-size:12px; color:var(--text-2);">
              <?= htmlspecialchars($b['tutor_nombre'] ?? '—') ?>
            </td>
            <td style="text-align:center;" onclick="event.stopPropagation()">
              <a href="bitacoras.php?ver=<?= $b['id_bitacora'] ?>"
                 class="btn btn-sm btn-outline-secondary">
                <i class="fa fa-<?= $editable ? 'pen-to-square' : 'eye' ?>"></i>
                <?= $editable ? 'Editar' : 'Ver' ?>
              </a>
            </td>
          </tr>
          <?php endforeach; endif; ?>
        </tbody>
      </table>
    </div>
    <?php endif; ?>

    <!-- Modal nueva semana -->
    <div class="modal fade" id="modalSemana" tabindex="-1">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title"><i class="fa fa-calendar-week me-2"></i>Nueva semana — Semana <?= $nuevaSemana ?></h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
          </div>
          <form method="POST">
            <input type="hidden" name="accion" value="crear_semana">
            <div class="modal-body">
              <div class="alert-dark-info p-3 mb-3" style="font-size:12px;">
                <i class="fa fa-info-circle me-1"></i>
                Crea la semana como borrador. Luego entra a ella para registrar tus actividades día a día.
              </div>
              <div class="row g-3">
                <div class="col-12">
                  <label class="form-label">Número de semana</label>
                  <input type="number" name="semana_numero" class="form-control"
                         value="<?= $nuevaSemana ?>" required min="1" max="52">
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Inicio de semana (Lunes)</label>
                  <input type="date" name="fecha_inicio_semana" class="form-control" required
                         value="<?= $lunesProx->format('Y-m-d') ?>">
                </div>
                <div class="col-sm-6">
                  <label class="form-label">Fin de semana (Viernes)</label>
                  <input type="date" name="fecha_fin_semana" class="form-control" required
                         value="<?= $viernesProx->format('Y-m-d') ?>">
                </div>
              </div>
            </div>
            <div class="modal-footer">
              <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancelar</button>
              <button type="submit" class="btn btn-primary">
                <i class="fa fa-calendar-plus me-1"></i>Crear semana
              </button>
            </div>
          </form>
        </div>
      </div>
    </div>

    <?php endif; // fin if verBit ?>

  </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>
<!-- ── Modal: Ver foto de evidencia ── -->
<div class="modal fade" id="modalFotoEvidencia" tabindex="-1">
  <div class="modal-dialog modal-dialog-centered modal-lg">
    <div class="modal-content" style="background:#0d1117;border:1px solid #30363d;">
      <div class="modal-header" style="border-bottom:1px solid #30363d;padding:12px 16px;">
        <h6 class="modal-title" style="color:#f0f6fc;">
          <i class="fa fa-camera me-2" style="color:#2ea8ff;"></i>Foto de evidencia
        </h6>
        <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body text-center" style="padding:16px;">
        <img id="fotoEvidenciaGrande" src="" alt="Evidencia"
             style="max-width:100%;max-height:75vh;border-radius:10px;object-fit:contain;">
      </div>
      <div class="modal-footer" style="border-top:1px solid #30363d;padding:10px 16px;">
        <a id="fotoEvidenciaDescarga" href="#" download target="_blank"
           class="btn btn-sm btn-outline-secondary">
          <i class="fa fa-download me-1"></i>Descargar
        </a>
        <button type="button" class="btn btn-sm btn-outline-secondary" data-bs-dismiss="modal">Cerrar</button>
      </div>
    </div>
  </div>
</div>

<script>
// Editar día — lee los data-* del botón pulsado
document.addEventListener('click', function(e) {
  const btn = e.target.closest('.btn-editar-dia');
  if (!btn) return;

  const fecha   = btn.dataset.fecha;
  const horas   = btn.dataset.horas;
  const desc    = btn.dataset.desc;
  const logros  = btn.dataset.logros;
  const dif     = btn.dataset.dif;
  const idBit   = btn.dataset.id;
  const fotoUrl = btn.dataset.foto;

  document.getElementById('edit_fecha').value        = fecha;
  document.getElementById('edit_horas').value        = horas;
  document.getElementById('edit_descripcion').value  = desc;
  document.getElementById('edit_logros').value       = logros;
  document.getElementById('edit_dificultades').value = dif;
  document.getElementById('edit_id_bitacora').value  = idBit;

  const fotoActualDiv = document.getElementById('edit_foto_actual');
  const fotoPreview   = document.getElementById('edit_foto_preview');
  if (fotoUrl) {
    fotoPreview.src             = fotoUrl;
    fotoActualDiv.style.display = 'block';
  } else {
    fotoActualDiv.style.display = 'none';
  }

  new bootstrap.Modal(document.getElementById('modalEditarDia')).show();
});

function abrirEditar() {} // mantenido por compatibilidad (ya no se usa)

function verFotoEvidencia(url) {
  document.getElementById('fotoEvidenciaGrande').src = url;
  document.getElementById('fotoEvidenciaDescarga').href = url;
  new bootstrap.Modal(document.getElementById('modalFotoEvidencia')).show();
}
// Vista previa de foto antes de subir
document.addEventListener('DOMContentLoaded', function(){
  var input = document.getElementById('inputFotoEvidencia');
  if (!input) return;
  input.addEventListener('change', function(){
    var preview = document.getElementById('previewFoto');
    var img     = document.getElementById('imgPreview');
    if (this.files && this.files[0]) {
      var reader = new FileReader();
      reader.onload = function(e){ img.src = e.target.result; preview.style.display='block'; };
      reader.readAsDataURL(this.files[0]);
    } else {
      preview.style.display = 'none';
    }
  });
});
</script>
</body>
</html>