<?php
/**
 * Portal del abonado (pagos.intermax.com.py).
 * nginx: root /var/www/ispgestion/portal; los estilos se toman de /var/www/ispgestion/public/assets.
 * Usa la misma base del sistema, con su propia sesión: el abonado solo ve SUS datos.
 */
declare(strict_types=1);
define('PORTAL', true);
require dirname(__DIR__) . '/app/bootstrap.php';

header('X-Frame-Options: SAMEORIGIN');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: same-origin');

$p = (string)($_GET['p'] ?? 'inicio');
if (is_post()) csrf_check();

if (cfg('portal_activo', '1') !== '1') {
    portal_top('Portal');
    echo '<div class="alert alert-warning mt-4">El portal de clientes no está disponible en este momento. Comuníquese con nuestra oficina.</div>';
    portal_bottom(); exit;
}

// ---------------------------------------------------------------- Salir
if ($p === 'salir') { unset($_SESSION['portal_ab']); session_regenerate_id(true); redirect(purl('login')); }

$ab = portal_abonado();

// ---------------------------------------------------------------- Ingreso
if (!$ab) {
    if (is_post() && $p === 'login') {
        if (portal_bloqueado()) {
            flash('Demasiados intentos. Espere unos minutos y vuelva a intentar.', 'danger');
        } elseif ($id = portal_login((string)post('ci'), (string)post('codigo'))) {
            session_regenerate_id(true);
            $_SESSION['portal_ab'] = $id; $_SESSION['portal_last'] = time();
            redirect(purl('inicio'));
        } else {
            flash('Los datos no coinciden. Verifique su CI/RUC y su código de abonado (figura en su recibo o factura).', 'danger');
        }
        redirect(purl('login'));
    }
    portal_top('Ingresar'); ?>
    <div class="row justify-content-center mt-3"><div class="col-md-8">
      <div class="card shadow-sm"><div class="card-body p-4">
        <h5 class="mb-1">Portal de clientes</h5>
        <p class="text-muted small">Consulte su deuda, informe su pago, descargue sus comprobantes o reporte una falla.</p>
        <?php if ($msg = cfg('portal_mensaje')): ?><div class="alert alert-info small"><?= nl2br(e($msg)) ?></div><?php endif; ?>
        <form method="post" action="<?= e(purl('login')) ?>" autocomplete="off"><?= csrf_field() ?>
          <label class="form-label">Cédula o RUC del titular</label>
          <input class="form-control form-control-lg mb-3" name="ci" inputmode="numeric" required placeholder="Ej: 1234567">
          <label class="form-label">Código de abonado</label>
          <input class="form-control form-control-lg mb-1" name="codigo" required placeholder="Ej: A00123">
          <div class="form-text mb-3">Figura en su recibo o factura. También puede escribir solo el número (123).</div>
          <button class="btn btn-primary btn-lg w-100"><i class="bi bi-box-arrow-in-right"></i> Ingresar</button>
        </form>
      </div></div></div></div>
    <?php portal_bottom(); exit;
}
$abId = (int)$ab['id'];

// ---------------------------------------------------------------- Comprobante (recibo / factura) del propio abonado
if ($p === 'comprobante') {
    $pid = (int)($_GET['id'] ?? 0);
    if ((int)val('SELECT abonado_id FROM pagos WHERE id=?', [$pid]) !== $abId) { http_response_code(404); exit('Comprobante no encontrado'); }
    [$pg, $ap, $saldo] = comprobante_datos($pid);
    $fmt = ($_GET['formato'] ?? 'a4') === 'ticket' ? 'ticket' : 'a4';
    header('Content-Type: text/html; charset=utf-8');
    echo '<!doctype html><html lang="es"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>'
       . e(comprobante_label($pg)) . '</title><style>' . comprobante_css($fmt, 80)
       . '.barra{font:14px Arial;text-align:center;margin:10px}.barra button{font-size:15px;padding:8px 16px}@media print{.barra{display:none}}</style></head><body>'
       . '<div class="barra"><button onclick="print()">🖨️ Imprimir / Guardar PDF</button> <a href="' . e(purl('pagos')) . '">Volver</a></div>'
       . comprobante_html($pg, $ap, $saldo, $fmt) . '</body></html>';
    exit;
}

// ---------------------------------------------------------------- Informar pago (transferencia + comprobante)
if ($p === 'pagar' && is_post()) {
    $monto = parse_gs((string)post('monto'));
    $ids = array_values(array_filter(array_map('intval', (array)post('cargos', []))));
    if ($ids) {   // solo cargos propios y pendientes
        $ids = array_map('intval', array_column(all('SELECT id FROM cargos WHERE abonado_id=? AND estado IN ("pendiente","parcial") AND id IN (' . implode(',', $ids) . ')', [$abId]), 'id'));
    }
    $err = [];
    if ($monto <= 0) $err[] = 'Indique el monto transferido.';
    if (trim((string)post('referencia')) === '') $err[] = 'Indique el número de operación o comprobante.';
    [$arch, $errA] = subir_archivos('comprobante', 'portal', 'tr' . $abId, PORTAL_ARCHIVOS, 1);
    if (!$arch) $err[] = $errA ? implode(' ', $errA) : 'Adjunte la foto o el PDF del comprobante de la transferencia.';
    if ($err) { foreach ($err as $x) flash($x, 'danger'); redirect(purl('pagar')); }
    q('INSERT INTO portal_pagos (abonado_id, metodo, monto, cargos, banco, referencia, fecha_transf, archivo, archivo_mime, nota, ip) VALUES (?,?,?,?,?,?,?,?,?,?,?)', [
        $abId, 'transferencia', $monto, $ids ? implode(',', $ids) : null, nul(mb_substr((string)post('banco'), 0, 80)), mb_substr((string)post('referencia'), 0, 80),
        preg_match('/^\d{4}-\d{2}-\d{2}$/', (string)post('fecha')) ? post('fecha') : date('Y-m-d'), $arch[0]['archivo'], $arch[0]['mime'],
        nul(mb_substr((string)post('nota'), 0, 255)), portal_ip()]);
    flash('¡Gracias! Recibimos su comprobante por ' . gs($monto) . '. Lo verificamos y le emitimos el recibo/factura; lo verá en "Mis pagos".');
    redirect(purl('pagos'));
}

// ---------------------------------------------------------------- Reportar falla
if ($p === 'soporte' && is_post()) {
    $cats = ['sin_servicio' => 'Sin servicio', 'lentitud' => 'Servicio lento', 'equipo' => 'Problema con el equipo', 'otro' => 'Otro'];
    $cat = isset($cats[post('categoria')]) ? post('categoria') : 'otro';
    $desc = trim((string)post('descripcion'));
    if (mb_strlen($desc) < 5) { flash('Describa brevemente el problema.', 'danger'); redirect(purl('soporte')); }
    if ((int)val("SELECT COUNT(*) FROM tickets WHERE abonado_id=? AND origen='portal' AND creado > NOW() - INTERVAL 10 MINUTE", [$abId]) >= 2) {
        flash('Ya recibimos su reporte. Un técnico se comunicará con usted.', 'warning'); redirect(purl('soporte'));
    }
    $cu = val("SELECT id FROM cuentas WHERE abonado_id=? AND estado<>'baja' ORDER BY (estado='activa') DESC, id LIMIT 1", [$abId]);
    q("INSERT INTO tickets (abonado_id, cuenta_id, asunto, descripcion, categoria, origen, prioridad, creado_por) VALUES (?,?,?,?,?, 'portal', ?, ?)", [
        $abId, $cu ?: null, mb_substr('[Portal] ' . $cats[$cat], 0, 150),
        mb_substr($desc, 0, 2000) . (post('contacto') !== '' ? "\nContacto indicado: " . mb_substr((string)post('contacto'), 0, 60) : ''),
        $cat, $cat === 'sin_servicio' ? 'alta' : 'media', portal_usuario_id()]);
    flash('Recibimos su reporte (ticket #' . last_id() . '). Un técnico se comunicará con usted.');
    redirect(purl('soporte'));
}

// ---------------------------------------------------------------- Actualizar datos de contacto
if ($p === 'datos' && is_post()) {
    $tel = mb_substr(preg_replace('/[^0-9+ ]/', '', (string)post('telefono')), 0, 40);
    $mail = trim((string)post('email'));
    if ($mail !== '' && !filter_var($mail, FILTER_VALIDATE_EMAIL)) { flash('El correo no es válido.', 'danger'); redirect(purl('datos')); }
    if ($tel === '' && $mail === '') { flash('Indique el teléfono o el correo a actualizar.', 'danger'); redirect(purl('datos')); }
    q("UPDATE portal_solicitudes SET estado='rechazada', revisado=NOW() WHERE abonado_id=? AND estado='pendiente'", [$abId]);   // reemplaza la anterior
    q('INSERT INTO portal_solicitudes (abonado_id, telefono, email, nota) VALUES (?,?,?,?)', [$abId, nul($tel), nul(mb_substr($mail, 0, 120)), nul(mb_substr((string)post('nota'), 0, 255))]);
    flash('Recibimos sus datos. Los actualizaremos en breve.');
    redirect(purl('datos'));
}

// ================================================================ Páginas
$deuda = deuda_total($abId);
$rec = recargo_mora_total($abId);
$cuentas = all("SELECT c.*, p.nombre plan, p.bajada_mbps, p.subida_mbps FROM cuentas c JOIN planes p ON p.id=c.plan_id WHERE c.abonado_id=? AND c.estado<>'baja' ORDER BY c.id", [$abId]);
$pendInf = all("SELECT * FROM portal_pagos WHERE abonado_id=? AND estado='pendiente' ORDER BY id DESC", [$abId]);

if ($p === 'pagar') {
    $pend = all("SELECT * FROM cargos WHERE abonado_id=? AND estado IN ('pendiente','parcial') ORDER BY fecha_vencimiento, id", [$abId]);
    $recN = recargos_mora($abId);
    portal_top('Pagar', $ab); ?>
    <h5>Pagar por transferencia</h5>
    <?php if ($pendInf): ?><div class="alert alert-warning small">Ya informó <?= count($pendInf) ?> pago(s) que estamos verificando. Si es el mismo, no hace falta volver a enviarlo.</div><?php endif; ?>
    <?php if (!$pend): ?><div class="alert alert-success">No tiene deudas pendientes. ¡Gracias!</div><?php portal_bottom(); exit; endif; ?>
    <form method="post" enctype="multipart/form-data" action="<?= e(purl('pagar')) ?>"><?= csrf_field() ?>
    <div class="card shadow-sm mb-3"><div class="card-header">1. Elija qué paga</div>
      <ul class="list-group list-group-flush">
      <?php foreach ($pend as $c): $r = $recN[(int)$c['id']]['monto'] ?? 0; $sub = (int)$c['saldo'] + $r; ?>
        <li class="list-group-item"><label class="d-flex gap-2 align-items-start w-100">
          <input type="checkbox" class="form-check-input mt-1 chk" name="cargos[]" value="<?= $c['id'] ?>" data-m="<?= $sub ?>" checked>
          <span class="flex-grow-1"><?= e($c['concepto']) ?><span class="d-block small <?= $c['fecha_vencimiento'] < date('Y-m-d') ? 'text-danger' : 'text-muted' ?>">Vence <?= fdate($c['fecha_vencimiento']) ?><?= $r ? ' · incluye recargo por mora ' . gs($r) : '' ?></span></span>
          <strong class="text-nowrap"><?= gs($sub) ?></strong></label></li>
      <?php endforeach; ?>
        <li class="list-group-item d-flex justify-content-between fs-5"><span>Total a pagar</span><strong id="tot"><?= gs($deuda + $rec) ?></strong></li>
      </ul></div>
    <div class="card shadow-sm mb-3"><div class="card-header">2. Transfiera a</div><div class="card-body">
      <?= cfg('portal_datos_bancarios') ? '<div style="white-space:pre-line">' . e(cfg('portal_datos_bancarios')) . '</div>' : '<span class="text-muted">Consulte nuestros datos bancarios en la oficina.</span>' ?>
      <div class="small text-muted mt-2">En el concepto de la transferencia indique su código: <strong><?= e($ab['codigo']) ?></strong></div></div></div>
    <div class="card shadow-sm mb-3"><div class="card-header">3. Envíenos el comprobante</div><div class="card-body">
      <div class="row g-2">
        <div class="col-6"><label class="form-label small mb-0">Monto transferido (Gs.)</label><input class="form-control" name="monto" id="monto" inputmode="numeric" required value="<?= fnum($deuda + $rec) ?>"></div>
        <div class="col-6"><label class="form-label small mb-0">Fecha</label><input type="date" class="form-control" name="fecha" value="<?= date('Y-m-d') ?>"></div>
        <div class="col-6"><label class="form-label small mb-0">Banco / billetera</label><input class="form-control" name="banco" placeholder="Ej: Ueno, Itaú, Tigo Money"></div>
        <div class="col-6"><label class="form-label small mb-0">N° de operación</label><input class="form-control" name="referencia" required></div>
        <div class="col-12"><label class="form-label small mb-0">Foto o PDF del comprobante</label><input type="file" class="form-control" name="comprobante[]" accept="image/*,application/pdf" required></div>
        <div class="col-12"><input class="form-control" name="nota" placeholder="Comentario (opcional)"></div>
      </div>
      <button class="btn btn-success btn-lg w-100 mt-3"><i class="bi bi-send"></i> Enviar comprobante</button>
      <div class="small text-muted mt-2">Verificamos la transferencia y le emitimos el recibo o la factura. Si su servicio está cortado por falta de pago, se reconecta al acreditarse.</div>
    </div></div></form>
    <script>
    (function(){const f=n=>'Gs. '+n.toLocaleString('es-PY'),t=document.getElementById('tot'),m=document.getElementById('monto');
      document.querySelectorAll('.chk').forEach(c=>c.addEventListener('change',()=>{let s=0;document.querySelectorAll('.chk:checked').forEach(x=>s+=+x.dataset.m);t.textContent=f(s);m.value=s.toLocaleString('es-PY');}));})();
    </script>
    <?php portal_bottom(); exit;
}

if ($p === 'pagos') {
    $pagos = all('SELECT * FROM pagos WHERE abonado_id=? ORDER BY fecha DESC, id DESC LIMIT 36', [$abId]);
    $inf = all("SELECT * FROM portal_pagos WHERE abonado_id=? ORDER BY id DESC LIMIT 10", [$abId]);
    portal_top('Mis pagos', $ab); ?>
    <?php if ($inf): ?>
    <h6>Pagos informados por el portal</h6>
    <div class="card shadow-sm mb-3"><ul class="list-group list-group-flush">
      <?php foreach ($inf as $x): $cls = ['pendiente' => 'warning', 'aprobado' => 'success', 'rechazado' => 'danger'][$x['estado']]; ?>
      <li class="list-group-item d-flex justify-content-between align-items-center"><span><?= fdate($x['creado']) ?> · <?= gs($x['monto']) ?> · op. <?= e($x['referencia']) ?>
        <?= $x['estado'] === 'rechazado' && $x['motivo'] ? '<span class="d-block small text-danger">' . e($x['motivo']) . '</span>' : '' ?></span>
        <span class="badge text-bg-<?= $cls ?>"><?= ['pendiente' => 'En verificación', 'aprobado' => 'Acreditado', 'rechazado' => 'Rechazado'][$x['estado']] ?></span></li>
      <?php endforeach; ?></ul></div>
    <?php endif; ?>
    <h6>Recibos y facturas</h6>
    <div class="card shadow-sm"><ul class="list-group list-group-flush">
      <?php foreach ($pagos as $x): ?>
      <li class="list-group-item d-flex justify-content-between align-items-center <?= $x['anulado'] ? 'text-muted text-decoration-line-through' : '' ?>">
        <span><strong><?= e(comprobante_label($x)) ?></strong><span class="d-block small text-muted"><?= fdate($x['fecha']) ?> · <?= e($x['metodo']) ?></span></span>
        <span class="text-end"><strong><?= gs($x['monto']) ?></strong><?php if (!$x['anulado']): ?><br>
          <a class="btn btn-sm btn-outline-primary mt-1" target="_blank" href="<?= e(purl('comprobante', ['id' => $x['id']])) ?>"><i class="bi bi-file-earmark-text"></i> Ver</a><?php endif; ?></span></li>
      <?php endforeach; if (!$pagos): ?><li class="list-group-item text-muted">Todavía no hay pagos registrados.</li><?php endif; ?>
    </ul></div>
    <?php portal_bottom(); exit;
}

if ($p === 'soporte') {
    $tks = all("SELECT id, asunto, estado, creado, cerrado FROM tickets WHERE abonado_id=? ORDER BY id DESC LIMIT 10", [$abId]);
    portal_top('Soporte', $ab); ?>
    <h5>Reportar una falla</h5>
    <div class="alert alert-light border small">Antes de reportar: apague el equipo (ONU/antena y router) 30 segundos y vuelva a encenderlo.<?= array_filter($cuentas, fn($c) => $c['estado'] === 'cortada') ? ' <strong class="text-danger">Su servicio figura cortado por falta de pago: regularice en "Pagar".</strong>' : '' ?></div>
    <form method="post" action="<?= e(purl('soporte')) ?>" class="card shadow-sm mb-3"><div class="card-body"><?= csrf_field() ?>
      <label class="form-label">¿Qué le pasa?</label>
      <select class="form-select mb-2" name="categoria"><option value="sin_servicio">No tengo internet</option><option value="lentitud">Internet lento o se corta</option><option value="equipo">Problema con el equipo / WiFi</option><option value="otro">Otro</option></select>
      <textarea class="form-control mb-2" name="descripcion" rows="3" required placeholder="Cuéntenos qué pasa y desde cuándo"></textarea>
      <input class="form-control mb-2" name="contacto" placeholder="Teléfono para contactarlo (si es otro)" value="">
      <button class="btn btn-primary w-100"><i class="bi bi-send"></i> Enviar reporte</button></div></form>
    <?php if ($tks): ?><h6>Mis reportes</h6><div class="card shadow-sm"><ul class="list-group list-group-flush">
      <?php foreach ($tks as $t): ?><li class="list-group-item d-flex justify-content-between"><span>#<?= $t['id'] ?> <?= e(preg_replace('/^\[Portal\]\s*/', '', $t['asunto'])) ?><span class="d-block small text-muted"><?= fdatetime($t['creado']) ?></span></span>
        <span class="badge text-bg-<?= in_array($t['estado'], ['resuelto', 'cerrado'], true) ? 'success' : 'warning' ?> align-self-center"><?= ['abierto' => 'Recibido', 'en_proceso' => 'En proceso', 'resuelto' => 'Resuelto', 'cerrado' => 'Cerrado'][$t['estado']] ?></span></li><?php endforeach; ?>
    </ul></div><?php endif; ?>
    <?php portal_bottom(); exit;
}

if ($p === 'datos') {
    $sol = one("SELECT * FROM portal_solicitudes WHERE abonado_id=? AND estado='pendiente' ORDER BY id DESC LIMIT 1", [$abId]);
    portal_top('Mis datos', $ab); ?>
    <h5>Mis datos</h5>
    <div class="card shadow-sm mb-3"><div class="card-body small"><dl class="row mb-0">
      <dt class="col-4">Titular</dt><dd class="col-8"><?= e($ab['nombre']) ?></dd>
      <dt class="col-4">Código</dt><dd class="col-8"><?= e($ab['codigo']) ?></dd>
      <dt class="col-4">Dirección</dt><dd class="col-8"><?= e($ab['direccion']) ?></dd>
      <dt class="col-4">Teléfono</dt><dd class="col-8"><?= e($ab['telefono']) ?></dd>
      <dt class="col-4">Correo</dt><dd class="col-8"><?= e($ab['email']) ?></dd></dl></div></div>
    <?php if ($sol): ?><div class="alert alert-info small">Tenemos pendiente su actualización: <?= e(trim(($sol['telefono'] ? 'tel. ' . $sol['telefono'] : '') . ' ' . ($sol['email'] ? $sol['email'] : ''))) ?>.</div><?php endif; ?>
    <form method="post" action="<?= e(purl('datos')) ?>" class="card shadow-sm"><div class="card-header">Actualizar teléfono o correo</div><div class="card-body"><?= csrf_field() ?>
      <input class="form-control mb-2" name="telefono" inputmode="tel" placeholder="Nuevo celular (ej. 0981 123 456)">
      <input type="email" class="form-control mb-2" name="email" placeholder="Nuevo correo electrónico">
      <input class="form-control mb-2" name="nota" placeholder="Comentario (opcional)">
      <button class="btn btn-primary w-100">Enviar</button>
      <div class="small text-muted mt-2">Para cambiar el titular, la dirección o el plan, comuníquese con nuestra oficina.</div></div></form>
    <?php portal_bottom(); exit;
}

// ---------------------------------------------------------------- Inicio
portal_top('Inicio', $ab);
$prox = val("SELECT MIN(fecha_vencimiento) FROM cargos WHERE abonado_id=? AND estado IN ('pendiente','parcial') AND fecha_vencimiento >= CURDATE()", [$abId]);
$vencido = (int)val("SELECT COALESCE(SUM(saldo),0) FROM cargos WHERE abonado_id=? AND estado IN ('pendiente','parcial') AND fecha_vencimiento < CURDATE()", [$abId]); ?>
<h5 class="mb-3">Hola, <?= e($ab['nombre']) ?></h5>
<div class="row g-3 mb-3">
  <div class="col-sm-6"><div class="card shadow-sm h-100 kpi <?= $deuda + $rec > 0 ? 'border-danger' : 'border-success' ?>"><div class="card-body">
    <div class="text-muted small">Saldo a pagar</div><div class="v <?= $deuda + $rec > 0 ? 'text-danger' : 'text-success' ?>"><?= gs($deuda + $rec) ?></div>
    <?php if ($rec): ?><div class="small text-danger">Incluye <?= gs($rec) ?> de recargo por mora</div><?php endif; ?>
    <?php if ($vencido): ?><div class="small text-danger">Vencido: <?= gs($vencido) ?></div><?php elseif ($prox): ?><div class="small text-muted">Próximo vencimiento: <?= fdate($prox) ?></div><?php endif; ?>
    <?php if ($deuda + $rec > 0): ?><a class="btn btn-success w-100 mt-2" href="<?= e(purl('pagar')) ?>"><i class="bi bi-cash-coin"></i> Pagar</a><?php else: ?><div class="small text-success mt-2"><i class="bi bi-check-circle"></i> Está al día. ¡Gracias!</div><?php endif; ?>
  </div></div></div>
  <div class="col-sm-6"><div class="card shadow-sm h-100"><div class="card-body">
    <div class="text-muted small mb-1">Mi servicio</div>
    <?php foreach ($cuentas as $c): ?>
      <div class="mb-2"><strong><?= e($c['plan']) ?></strong><?= (int)$c['bajada_mbps'] ? ' <span class="text-muted small">' . (int)$c['bajada_mbps'] . ' Mbps</span>' : '' ?>
        <span class="badge text-bg-<?= $c['estado'] === 'activa' ? 'success' : 'danger' ?>"><?= $c['estado'] === 'activa' ? 'Activo' : 'Cortado' ?></span>
        <div class="small text-muted">Vence el día <?= (int)$c['dia_vencimiento'] ?> de cada mes</div></div>
    <?php endforeach; if (!$cuentas): ?><div class="text-muted small">Sin servicios activos.</div><?php endif; ?>
    <a class="btn btn-outline-primary btn-sm w-100" href="<?= e(purl('soporte')) ?>"><i class="bi bi-headset"></i> Reportar una falla</a>
  </div></div></div>
</div>
<?php if ($pendInf): ?><div class="alert alert-warning small"><i class="bi bi-hourglass-split"></i> Estamos verificando <?= count($pendInf) ?> pago(s) informado(s) por <?= gs(array_sum(array_column($pendInf, 'monto'))) ?>.</div><?php endif; ?>
<a class="btn btn-light border w-100" href="<?= e(purl('pagos')) ?>"><i class="bi bi-receipt"></i> Ver mis recibos y facturas</a>
<?php portal_bottom();
