<?php
// superadmin/dashboard.php
require_once __DIR__ . '/auth_sa.php';

$db  = getDB();
$sa  = sa_user();

// ── Helper: generar token del instituto ─────────────────
// Fórmula: iniciales del rector + últimos 3 dígitos del RUC
function tokenInstituto(string $rector, string $ruc): string {
    $palabras  = array_filter(explode(' ', strtoupper(trim($rector))));
    $iniciales = implode('', array_map(fn($p) => $p[0], $palabras));
    $soloNum   = preg_replace('/\D/', '', $ruc);
    $ultimos3  = substr($soloNum, -3);
    return $iniciales . $ultimos3;
}

// ── Helper: obtener o generar+guardar token en BD ───────
// Lee institutos.token; si está vacío y hay rector+RUC, lo genera y lo persiste.
function resolverToken(PDO $db, array $inst): string {
    // Si ya tiene token en BD, usarlo directamente
    if (!empty($inst['token'])) {
        return $inst['token'];
    }
    // Si no tiene token pero tiene rector y RUC, generarlo y guardarlo
    $rector = trim($inst['nombre_rector'] ?? '');
    $ruc    = trim($inst['ruc'] ?? '');
    if (!$rector || !$ruc) {
        return ''; // sin datos suficientes
    }
    $nuevoToken = tokenInstituto($rector, $ruc);
    try {
        $db->prepare("UPDATE institutos SET token = :tk WHERE id_instituto = :id")
           ->execute([':tk' => $nuevoToken, ':id' => $inst['id_instituto']]);
    } catch (Exception) {
        // Si hay colisión de token único, agregar sufijo con id
        $nuevoToken = $nuevoToken . $inst['id_instituto'];
        try {
            $db->prepare("UPDATE institutos SET token = :tk WHERE id_instituto = :id")
               ->execute([':tk' => $nuevoToken, ':id' => $inst['id_instituto']]);
        } catch (Exception) { $nuevoToken = ''; }
    }
    return $nuevoToken;
}

// ── Acción: toggle activo instituto ──────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $accion = $_POST['accion'] ?? '';
    $idI    = (int)($_POST['id_instituto'] ?? 0);

    if ($accion === 'toggle_activo' && $idI) {
        $db->prepare("UPDATE institutos SET activo = NOT activo WHERE id_instituto=:id")
           ->execute([':id' => $idI]);
    }
    if ($accion === 'renovar_licencia' && $idI) {
        $meses = (int)($_POST['meses'] ?? 12);
        $db->prepare("
            UPDATE licencias SET
              fecha_fin = DATE_ADD(GREATEST(fecha_fin, CURDATE()), INTERVAL :m MONTH),
              activa = 1,
              updated_at = NOW()
            WHERE id_instituto=:id ORDER BY id_licencia DESC LIMIT 1
        ")->execute([':m' => $meses, ':id' => $idI]);
    }
    header('Location: dashboard.php'); exit;
}

// ── Cargar todos los institutos con su licencia activa ──
$institutos = $db->query("
    SELECT i.*,
           l.plan, l.fecha_inicio, l.fecha_fin, l.max_estudiantes,
           l.precio_anual, l.precio_estudiante, l.activa AS lic_activa,
           DATEDIFF(l.fecha_fin, CURDATE()) AS dias_restantes,
           (SELECT COUNT(*) FROM usuarios u WHERE u.id_instituto = i.id_instituto AND u.activo=1) AS total_usuarios,
           (SELECT COUNT(*) FROM estudiantes e WHERE e.id_instituto = i.id_instituto) AS total_estudiantes
    FROM institutos i
    LEFT JOIN licencias l ON l.id_licencia = (
        SELECT MAX(id_licencia) FROM licencias WHERE id_instituto = i.id_instituto AND activa=1
    )
    ORDER BY i.activo DESC, i.nombre ASC
")->fetchAll();

// ── Stats globales ───────────────────────────────────────
$stats = [
    'total'     => count($institutos),
    'activos'   => count(array_filter($institutos, fn($i) => $i['activo'] && $i['dias_restantes'] >= 0)),
    'vencidos'  => count(array_filter($institutos, fn($i) => $i['activo'] && $i['dias_restantes'] < 0)),
    'inactivos' => count(array_filter($institutos, fn($i) => !$i['activo'])),
    'ingresos'  => array_sum(array_column($institutos, 'precio_anual')),
];
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>SIGVP — Panel Superadmin</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" rel="stylesheet">
<style>
*{box-sizing:border-box;}
body{background:#0f172a;font-family:'Segoe UI',sans-serif;color:#e2e8f0;min-height:100vh;}
.navbar-sa{background:#1e1b4b;border-bottom:1px solid #312e81;padding:12px 24px;
           display:flex;align-items:center;justify-content:space-between;}
.navbar-sa .brand{font-size:18px;font-weight:700;color:#fff;display:flex;align-items:center;gap:10px;}
.navbar-sa .brand .badge-sa{background:#fbbf24;color:#78350f;font-size:10px;font-weight:700;
                             padding:2px 8px;border-radius:20px;text-transform:uppercase;}
.navbar-sa .user-info{font-size:12px;color:#a5b4fc;display:flex;align-items:center;gap:12px;}
.main{padding:28px 24px;}
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:14px;margin-bottom:28px;}
.kpi{background:#1e293b;border-radius:12px;padding:18px;border:1px solid #334155;}
.kpi-val{font-size:28px;font-weight:700;line-height:1;margin-bottom:4px;}
.kpi-lbl{font-size:12px;color:#94a3b8;}
.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;}
.section-header h5{font-size:14px;font-weight:700;color:#e2e8f0;margin:0;letter-spacing:.5px;text-transform:uppercase;}
.btn-nuevo{background:#4338ca;color:#fff;border:none;border-radius:8px;padding:8px 16px;
           font-size:13px;font-weight:600;cursor:pointer;text-decoration:none;display:inline-flex;align-items:center;gap:6px;}
.btn-nuevo:hover{background:#3730a3;color:#fff;}
.inst-card{background:#1e293b;border:1px solid #334155;border-radius:12px;padding:18px;
           margin-bottom:14px;display:flex;gap:16px;align-items:flex-start;
           transition:border-color .2s;}
.inst-card:hover{border-color:#4338ca;}
.inst-card.vencido{border-color:#991b1b;background:#1c0a0a;}
.inst-card.inactivo{opacity:.55;}
.inst-logo{width:56px;height:56px;border-radius:10px;object-fit:contain;
           background:#0f172a;border:1px solid #334155;padding:4px;flex-shrink:0;}
.inst-logo-placeholder{width:56px;height:56px;border-radius:10px;background:#312e81;
                        display:flex;align-items:center;justify-content:center;
                        font-size:20px;font-weight:700;color:#a5b4fc;flex-shrink:0;}
.inst-info{flex:1;min-width:0;}
.inst-nombre{font-size:15px;font-weight:700;color:#f1f5f9;margin-bottom:2px;}
.inst-ruc{font-size:11px;color:#64748b;font-family:monospace;}
.inst-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;}
.tag{font-size:10px;font-weight:600;padding:2px 8px;border-radius:20px;}
.tag-activa{background:#14532d;color:#86efac;}
.tag-vencida{background:#7f1d1d;color:#fca5a5;}
.tag-por-vencer{background:#78350f;color:#fcd34d;}
.tag-prueba{background:#312e81;color:#a5b4fc;}
.tag-profesional{background:#1e3a5f;color:#93c5fd;}
.tag-basico{background:#1c3328;color:#6ee7b7;}
.tag-inactivo{background:#1e293b;color:#64748b;}
.lic-bar{height:5px;background:#334155;border-radius:3px;margin-top:8px;overflow:hidden;}
.lic-bar-fill{height:100%;border-radius:3px;transition:width .3s;}
.inst-actions{display:flex;flex-direction:column;gap:6px;flex-shrink:0;}
.btn-sm-sa{font-size:11px;font-weight:600;padding:5px 12px;border-radius:6px;border:none;
           cursor:pointer;display:inline-flex;align-items:center;gap:5px;white-space:nowrap;}
.btn-edit{background:#1e3a5f;color:#93c5fd;}
.btn-edit:hover{background:#1d4ed8;color:#fff;}
.btn-toggle{background:#1c3328;color:#6ee7b7;}
.btn-toggle:hover{background:#15803d;color:#fff;}
.btn-toggle-off{background:#3b0000;color:#fca5a5;}
.btn-toggle-off:hover{background:#dc2626;color:#fff;}
.btn-renew{background:#451a03;color:#fcd34d;}
.btn-renew:hover{background:#d97706;color:#fff;}
.empty-state{text-align:center;padding:60px 20px;color:#475569;}
.modal-sa .modal-content{background:#1e293b;border:1px solid #334155;color:#e2e8f0;border-radius:12px;}
.modal-sa .modal-header{border-bottom:1px solid #334155;background:#0f172a;border-radius:12px 12px 0 0;}
.modal-sa .modal-footer{border-top:1px solid #334155;background:#0f172a;border-radius:0 0 12px 12px;}
.form-control-sa{background:#0f172a;border:1px solid #334155;color:#e2e8f0;border-radius:8px;
                  padding:8px 12px;font-size:13px;width:100%;}
.form-control-sa:focus{border-color:#4338ca;outline:none;box-shadow:0 0 0 3px rgba(67,56,202,.2);}
.form-label-sa{font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;
               letter-spacing:.5px;display:block;margin-bottom:5px;}
select.form-control-sa option{background:#1e293b;}

/* ── Link de registro por instituto ── */
.inst-link-row {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 10px;
  background: #0f172a;
  border: 1px dashed #334155;
  border-radius: 8px;
  padding: 7px 10px;
}
.inst-link-label {
  font-size: 10px;
  font-weight: 700;
  color: #4338ca;
  text-transform: uppercase;
  letter-spacing: .5px;
  white-space: nowrap;
  display: flex;
  align-items: center;
  gap: 5px;
  flex-shrink: 0;
}
.inst-link-url {
  font-size: 10.5px;
  color: #a5b4fc;
  font-family: monospace;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  flex: 1;
  min-width: 0;
}
.inst-link-token {
  font-weight: 800;
  color: #fbbf24;
}
.btn-copy-link {
  background: #312e81;
  border: none;
  border-radius: 6px;
  color: #a5b4fc;
  font-size: 10px;
  font-weight: 700;
  padding: 4px 9px;
  cursor: pointer;
  white-space: nowrap;
  transition: background .15s, color .15s;
  flex-shrink: 0;
}
.btn-copy-link:hover { background: #4338ca; color: #fff; }
.copy-ok { color: #86efac !important; font-size: 10px; display: none; flex-shrink: 0; }
</style>
</head>
<body>

<!-- NAVBAR -->
<div class="navbar-sa">
  <div class="brand">
    <i class="fa fa-shield-halved" style="color:#a5b4fc;font-size:20px;"></i>
    SIGVP
    <span class="badge-sa">Super Admin</span>
  </div>
  <div class="user-info">
    <span><i class="fa fa-user-tie me-1"></i><?= htmlspecialchars($sa['nombre']) ?></span>
    <a href="logout.php" style="color:#fca5a5;text-decoration:none;font-size:12px;">
      <i class="fa fa-right-from-bracket me-1"></i>Salir
    </a>
  </div>
</div>

<div class="main">

  <!-- KPIs -->
  <div class="kpi-grid">
    <div class="kpi">
      <div class="kpi-val" style="color:#a5b4fc;"><?= $stats['total'] ?></div>
      <div class="kpi-lbl">Total institutos</div>
    </div>
    <div class="kpi">
      <div class="kpi-val" style="color:#86efac;"><?= $stats['activos'] ?></div>
      <div class="kpi-lbl">Licencias activas</div>
    </div>
    <div class="kpi">
      <div class="kpi-val" style="color:#fca5a5;"><?= $stats['vencidos'] ?></div>
      <div class="kpi-lbl">Licencias vencidas</div>
    </div>
    <div class="kpi">
      <div class="kpi-val" style="color:#64748b;"><?= $stats['inactivos'] ?></div>
      <div class="kpi-lbl">Inactivos</div>
    </div>
    <div class="kpi">
      <div class="kpi-val" style="color:#fcd34d;">$<?= number_format($stats['ingresos'], 0) ?></div>
      <div class="kpi-lbl">Ingresos anuales</div>
    </div>
  </div>

  <!-- Header lista -->
  <div class="section-header">
    <h5><i class="fa fa-building me-2" style="color:#a5b4fc;"></i>Institutos registrados</h5>
    <a href="nuevo_instituto.php" class="btn-nuevo">
      <i class="fa fa-plus"></i> Nuevo instituto
    </a>
  </div>

  <!-- Lista de institutos -->
  <?php if (empty($institutos)): ?>
  <div class="empty-state">
    <i class="fa fa-building fa-3x mb-3" style="color:#334155;"></i>
    <div style="font-size:16px;font-weight:600;margin-bottom:8px;">Sin institutos registrados</div>
    <div style="font-size:13px;">Crea tu primer cliente con el botón "Nuevo instituto"</div>
  </div>
  <?php endif; ?>

  <?php foreach ($institutos as $inst):
    $dias = (int)($inst['dias_restantes'] ?? -999);
    $plan = $inst['plan'] ?? 'sin_licencia';

    // Estado licencia
    if (!$inst['activo']) {
      $estadoTag = '<span class="tag tag-inactivo">Instituto inactivo</span>';
      $cardClass = 'inactivo';
    } elseif ($dias < 0) {
      $estadoTag = '<span class="tag tag-vencida"><i class="fa fa-circle-xmark me-1"></i>Vencida hace '.abs($dias).' días</span>';
      $cardClass = 'vencido';
    } elseif ($dias <= 30) {
      $estadoTag = '<span class="tag tag-por-vencer"><i class="fa fa-triangle-exclamation me-1"></i>Vence en '.$dias.' días</span>';
      $cardClass = '';
    } else {
      $estadoTag = '<span class="tag tag-activa"><i class="fa fa-circle-check me-1"></i>Activa — '.$dias.' días</span>';
      $cardClass = '';
    }

    $planTag = match($plan) {
      'prueba'      => '<span class="tag tag-prueba">Prueba</span>',
      'basico'      => '<span class="tag tag-basico">Básico</span>',
      'profesional' => '<span class="tag tag-profesional">Profesional</span>',
      'enterprise'  => '<span class="tag" style="background:#3b0764;color:#e9d5ff;">Enterprise</span>',
      default       => '<span class="tag tag-inactivo">Sin licencia</span>',
    };

    // Barra de tiempo de licencia
    $pctBar   = 0;
    $barColor = '#86efac';
    if ($inst['fecha_inicio'] && $inst['fecha_fin']) {
      $total    = max(1, (strtotime($inst['fecha_fin']) - strtotime($inst['fecha_inicio'])) / 86400);
      $restante = max(0, $dias);
      $pctBar   = min(100, round($restante / $total * 100));
      $barColor = $pctBar > 30 ? '#86efac' : ($pctBar > 10 ? '#fcd34d' : '#fca5a5');
    }

    // ── Token del instituto: leer de BD (o generar y guardar si falta) ──
    $token      = resolverToken($db, $inst);
    $tieneToken = $token !== '';
    $linkReg    = $tieneToken ? BASE_URL . '/auth/login.php?inst=' . urlencode($token) : '';
    $idCard     = 'link-' . $inst['id_instituto'];
  ?>
  <div class="inst-card <?= $cardClass ?>">
    <!-- Logo -->
    <?php if ($inst['logo'] && file_exists(BASE_PATH . '/uploads/institutos/' . $inst['logo'])): ?>
      <img src="<?= BASE_URL ?>/uploads/institutos/<?= htmlspecialchars($inst['logo']) ?>"
           class="inst-logo" alt="Logo">
    <?php else: ?>
      <div class="inst-logo-placeholder">
        <?= mb_strtoupper(mb_substr($inst['nombre'], 0, 2)) ?>
      </div>
    <?php endif; ?>

    <!-- Info -->
    <div class="inst-info">
      <div class="inst-nombre"><?= htmlspecialchars($inst['nombre']) ?></div>
      <div class="inst-ruc">
        <?= $inst['ruc'] ? 'RUC: '.$inst['ruc'] : 'Sin RUC' ?>
        &nbsp;·&nbsp; <?= htmlspecialchars($inst['ciudad'] ?? '—') ?>
        <?= $inst['provincia'] ? ', '.$inst['provincia'] : '' ?>
      </div>
      <div class="inst-meta">
        <?= $estadoTag ?>
        <?= $planTag ?>
        <span class="tag" style="background:#0f172a;color:#64748b;border:1px solid #334155;">
          <i class="fa fa-users me-1"></i><?= $inst['total_estudiantes'] ?> est.
        </span>
        <span class="tag" style="background:#0f172a;color:#64748b;border:1px solid #334155;">
          <i class="fa fa-dollar-sign me-1"></i>$<?= number_format($inst['precio_anual'] ?? 0, 0) ?>/año
        </span>
        <?php if ($inst['fecha_fin']): ?>
          <span class="tag" style="background:#0f172a;color:#64748b;border:1px solid #334155;">
            <i class="fa fa-calendar me-1"></i>Vence: <?= date('d/m/Y', strtotime($inst['fecha_fin'])) ?>
          </span>
        <?php endif; ?>
      </div>

      <!-- Barra de tiempo restante -->
      <?php if ($inst['fecha_fin']): ?>
      <div class="lic-bar" style="margin-top:10px;">
        <div class="lic-bar-fill" style="width:<?= $pctBar ?>%;background:<?= $barColor ?>;"></div>
      </div>
      <?php endif; ?>

      <!-- ── LINK DE REGISTRO DEL INSTITUTO ── -->
      <?php if ($tieneToken): ?>
      <div class="inst-link-row">
        <span class="inst-link-label">
          <i class="fa fa-link"></i> Link registro
        </span>
        <span class="inst-link-url" id="<?= $idCard ?>">
          <?= htmlspecialchars(BASE_URL) ?>/auth/login.php?inst=<span class="inst-link-token"><?= htmlspecialchars($token) ?></span>
        </span>
        <button class="btn-copy-link" onclick="copiarLink('<?= htmlspecialchars($linkReg, ENT_QUOTES) ?>', '<?= $idCard ?>-ok')">
          <i class="fa fa-copy"></i> Copiar
        </button>
        <span class="copy-ok" id="<?= $idCard ?>-ok">
          <i class="fa fa-check"></i> Copiado
        </span>
      </div>
      <?php else: ?>
      <div class="inst-link-row" style="opacity:.5;">
        <span class="inst-link-label" style="color:#64748b;">
          <i class="fa fa-triangle-exclamation"></i> Sin link
        </span>
        <span style="font-size:10.5px;color:#475569;">
          Agrega nombre del rector y RUC en
          <a href="editar_instituto.php?id=<?= $inst['id_instituto'] ?>" style="color:#4338ca;">Editar</a>
          para generar el link.
        </span>
      </div>
      <?php endif; ?>

    </div><!-- /.inst-info -->

    <!-- Acciones -->
    <div class="inst-actions">
      <a href="editar_instituto.php?id=<?= $inst['id_instituto'] ?>" class="btn-sm-sa btn-edit">
        <i class="fa fa-pen"></i> Editar
      </a>

      <form method="POST" style="margin:0;">
        <input type="hidden" name="accion" value="toggle_activo">
        <input type="hidden" name="id_instituto" value="<?= $inst['id_instituto'] ?>">
        <button type="submit" class="btn-sm-sa <?= $inst['activo'] ? 'btn-toggle' : 'btn-toggle-off' ?>"
                onclick="return confirm('<?= $inst['activo'] ? '¿Desactivar este instituto?' : '¿Reactivar este instituto?' ?>')">
          <i class="fa fa-<?= $inst['activo'] ? 'toggle-on' : 'toggle-off' ?>"></i>
          <?= $inst['activo'] ? 'Activo' : 'Inactivo' ?>
        </button>
      </form>

      <button type="button" class="btn-sm-sa btn-renew"
              onclick="abrirRenovar(<?= $inst['id_instituto'] ?>, '<?= htmlspecialchars($inst['nombre'], ENT_QUOTES) ?>')">
        <i class="fa fa-rotate"></i> Renovar
      </button>
    </div>
  </div>
  <?php endforeach; ?>

</div>

<!-- MODAL RENOVAR LICENCIA -->
<div class="modal fade modal-sa" id="modalRenovar" tabindex="-1">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h6 class="modal-title" style="color:#e2e8f0;font-size:14px;font-weight:700;">
          <i class="fa fa-rotate me-2" style="color:#fcd34d;"></i>Renovar licencia
        </h6>
        <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST">
        <input type="hidden" name="accion" value="renovar_licencia">
        <input type="hidden" name="id_instituto" id="renov-id">
        <div class="modal-body" style="padding:20px;">
          <div style="font-size:13px;color:#94a3b8;margin-bottom:16px;">
            Instituto: <strong id="renov-nombre" style="color:#e2e8f0;"></strong>
          </div>
          <label class="form-label-sa">Meses a agregar</label>
          <select name="meses" class="form-control-sa" style="margin-bottom:12px;">
            <option value="1">1 mes</option>
            <option value="3">3 meses</option>
            <option value="6">6 meses</option>
            <option value="12" selected>12 meses (1 año)</option>
            <option value="24">24 meses (2 años)</option>
          </select>
          <div style="font-size:11px;color:#64748b;">
            Si la licencia ya venció, se calcula desde hoy. Si aún está vigente, se extiende desde la fecha de vencimiento actual.
          </div>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn-sm-sa" style="background:#334155;color:#94a3b8;"
                  data-bs-dismiss="modal">Cancelar</button>
          <button type="submit" class="btn-sm-sa btn-renew" style="padding:8px 18px;">
            <i class="fa fa-rotate me-1"></i>Renovar licencia
          </button>
        </div>
      </form>
    </div>
  </div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script>
<script>
function abrirRenovar(id, nombre) {
  document.getElementById('renov-id').value = id;
  document.getElementById('renov-nombre').textContent = nombre;
  new bootstrap.Modal('#modalRenovar').show();
}

function copiarLink(url, okId) {
  navigator.clipboard.writeText(url).then(() => {
    const ok = document.getElementById(okId);
    ok.style.display = 'flex';
    setTimeout(() => ok.style.display = 'none', 2500);
  });
}
</script>
</body>
</html>