<?php
// revisar_categorias.php
// Recorre contactos (nuevo -> viejo), toma primer mensaje recibido con media_path, hace OCR + IA, guarda nota.

if (session_status() === PHP_SESSION_NONE) session_start();
if (!ob_get_level()) ob_start();
@date_default_timezone_set('America/Argentina/Buenos_Aires');

require_once __DIR__ . '/config.php';
$pdo = db();

error_reporting(0);
ini_set('display_errors', '0');

require_once __DIR__ . '/reconocer_ocr.php';

// Ajustá a tu base real
if (!defined('MEDIA_BASE_URL')) {
    define('MEDIA_BASE_URL', 'https://nodo11.radiosnet.com.ar/whatsapp_ofi/');
}

// categorías permitidas (una palabra en nota)
$CATS = ['jingle','sistemastock','radiosnet','flyer','sitioweb'];

function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }

function build_media_url($mediaPath) {
    $mediaPath = trim((string)$mediaPath);
    if ($mediaPath === '' || $mediaPath === 'NULL') return '';
    if (stripos($mediaPath, 'http://') === 0 || stripos($mediaPath, 'https://') === 0) return $mediaPath;
    return MEDIA_BASE_URL . ltrim($mediaPath, '/');
}

function openai_classificar_categoria($ocrText, $msgText='') {
    // Heurística rápida primero (barata)
    $t = mb_strtolower(trim($ocrText . "\n" . $msgText), 'UTF-8');

    // sitioweb (prioridad antes que flyer)
    if (preg_match('/\b(sitio\s*web|p[aá]gina\s*web|web\s*profesional|landing|wordpress|tienda\s*online|e-?commerce)\b/u', $t)) return 'sitioweb';
    if (preg_match('/\b(dominio|alojamiento|hosting|host|servidor|ssl)\b/u', $t) && preg_match('/\b(incluye|plan|mensual|por\s*mes|al\s*mes|soles|usd|\$)\b/u', $t)) return 'sitioweb';
    if (preg_match('/incluye\s*(dise[ñn]o|diseño)\s*\+.*(dominio).*(alojamiento|hosting)/u', $t)) return 'sitioweb';

    if (preg_match('/\b(jingle|canci[oó]n publicitaria|cu[ñn]a|spot|trabajamos todos los ritmos|ritmos|segunda canci[oó]n)\b/u', $t)) return 'jingle';
    if (preg_match('/\b(sistemastock|stock|pos|punto de venta|caja|ticket|kiosco|inventario|codigos)\b/u', $t)) return 'sistemastock';
    if (preg_match('/\b(radiosnet|radio online|streaming|autodj|shoutcast|icecast|portal|hosting|app)\b/u', $t)) return 'radiosnet';
    if (preg_match('/\b(flyer|banner|dise[ñn]o|instagram|historia 9:16|post 1:1|publicidad)\b/u', $t)) return 'flyer';

    // Si no alcanzó, IA (solo devuelve una palabra)
    if (!defined('OPENAI_API_KEY') || trim(OPENAI_API_KEY) === '') return 'flyer';

    $prompt = "Clasificá el servicio que busca el cliente según el texto del flyer. Respuesta obligatoria: una sola palabra exacta entre: jingle, sistemastock, radiosnet, sitioweb, flyer. No agregues nada más.";
    $input  = "TEXTO_OCR:\n".$ocrText."\n\nMENSAJE:\n".$msgText;

    $payload = [
        'model' => 'gpt-4o-mini',
        'temperature' => 0.0,
        'max_tokens' => 10,
        'messages' => [
            ['role'=>'system','content'=>$prompt],
            ['role'=>'user','content'=>$input],
        ]
    ];

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => 'https://api.openai.com/v1/chat/completions',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . OPENAI_API_KEY
        ],
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
    ]);
    $resp = curl_exec($ch);
    $err  = curl_error($ch);
    $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($err || $code < 200 || $code >= 300) return 'flyer';

    $data = json_decode($resp, true);
    $out = trim((string)($data['choices'][0]['message']['content'] ?? ''));
    $out = strtolower(preg_replace('/[^a-z]/', '', $out));

    return in_array($out, ['jingle','sistemastock','radiosnet','sitioweb','flyer'], true) ? $out : 'flyer';
}

function get_contact($pdo, $cid) {
    $st = $pdo->prepare("SELECT id, nombre, telefono, nota FROM contactos WHERE id=? LIMIT 1");
    $st->execute([(int)$cid]);
    return $st->fetch(PDO::FETCH_ASSOC);
}

function get_first_flyer_message($pdo, $cid) {
    // 1) el primer RECIBIDO que tenga media_path (flyer real)
    $st = $pdo->prepare("
        SELECT id, fecha, direccion, tipo, mensaje, media_path
        FROM charlas
        WHERE contacto_id = ?
          AND direccion = 'recibido'
          AND media_path IS NOT NULL
          AND TRIM(media_path) <> ''
          AND TRIM(media_path) <> 'NULL'
        ORDER BY fecha ASC, id ASC
        LIMIT 1
    ");
    $st->execute([(int)$cid]);
    $m = $st->fetch(PDO::FETCH_ASSOC);
    if ($m) return $m;

    // 2) fallback: cualquier dirección con media_path
    $st = $pdo->prepare("
        SELECT id, fecha, direccion, tipo, mensaje, media_path
        FROM charlas
        WHERE contacto_id = ?
          AND media_path IS NOT NULL
          AND TRIM(media_path) <> ''
          AND TRIM(media_path) <> 'NULL'
        ORDER BY fecha ASC, id ASC
        LIMIT 1
    ");
    $st->execute([(int)$cid]);
    $m = $st->fetch(PDO::FETCH_ASSOC);
    if ($m) return $m;

    // 3) fallback final: primer mensaje aunque no tenga media
    $st = $pdo->prepare("
        SELECT id, fecha, direccion, tipo, mensaje, media_path
        FROM charlas
        WHERE contacto_id = ?
        ORDER BY fecha ASC, id ASC
        LIMIT 1
    ");
    $st->execute([(int)$cid]);
    return $st->fetch(PDO::FETCH_ASSOC) ?: null;
}

function get_prev_next_ids($pdo, $cid) {
    $cid = (int)$cid;

    $prev = $pdo->prepare("SELECT id FROM contactos WHERE id > ? ORDER BY id ASC LIMIT 1");
    $prev->execute([$cid]);
    $prevId = $prev->fetchColumn();

    $next = $pdo->prepare("SELECT id FROM contactos WHERE id < ? ORDER BY id DESC LIMIT 1");
    $next->execute([$cid]);
    $nextId = $next->fetchColumn();

    return [$prevId ? (int)$prevId : 0, $nextId ? (int)$nextId : 0];
}

function total_contactos($pdo) {
    return (int)$pdo->query("SELECT COUNT(*) FROM contactos")->fetchColumn();
}

// elegir contacto actual
$cid = isset($_GET['cid']) ? (int)$_GET['cid'] : 0;
$force = isset($_GET['force']) && $_GET['force'] == '1';

if ($cid <= 0) {
    $cid = (int)$pdo->query("SELECT id FROM contactos ORDER BY id DESC LIMIT 1")->fetchColumn();
}

$contact = get_contact($pdo, $cid);
if (!$contact) {
    if (ob_get_level()) @ob_clean();
    echo "Contacto inexistente";
    exit;
}

list($prevId, $nextId) = get_prev_next_ids($pdo, $cid);

$flyerMsg = get_first_flyer_message($pdo, $cid);
$flyerMediaPath = $flyerMsg ? trim((string)($flyerMsg['media_path'] ?? '')) : '';
$flyerMediaUrl  = build_media_url($flyerMediaPath);

// Si hay media_path, lo tratamos como imagen (aunque no tenga extensión)
$mostrarComoImagen = ($flyerMediaUrl !== '');

// Procesamiento automático: SOLO si nota está vacía (o force=1)
$notaActual = trim((string)($contact['nota'] ?? ''));
$notaVacia = ($notaActual === '' || $notaActual === 'NULL');
$hacerProceso = $force || $notaVacia;

$ocrText = '';
$categoria = $notaVacia ? '' : $notaActual;
$ocrError = '';

if ($hacerProceso) {
    if ($flyerMediaUrl !== '') {
        $ocr = ocr_openai_vision_url($flyerMediaUrl);
        if (!empty($ocr['ok'])) {
            $ocrText = trim((string)$ocr['text']);
            $categoria = openai_classificar_categoria($ocrText, (string)($flyerMsg['mensaje'] ?? ''));
        } else {
            $ocrError = (string)($ocr['error'] ?? 'Error OCR');
            // Sin OCR, al menos clasificamos por texto del mensaje
            $categoria = openai_classificar_categoria('', (string)($flyerMsg['mensaje'] ?? ''));
        }
    } else {
        // No hay media: clasifico por mensaje
        $categoria = openai_classificar_categoria('', (string)($flyerMsg['mensaje'] ?? ''));
    }

    // Guardar nota (una palabra)
    if (!in_array($categoria, $CATS, true)) $categoria = 'flyer';
    $up = $pdo->prepare("UPDATE contactos SET nota=? WHERE id=? LIMIT 1");
    $up->execute([$categoria, $cid]);
    $notaActual = $categoria;
}

$total = total_contactos($pdo);

if (ob_get_level()) @ob_clean();
?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Revisar categorías</title>
<style>
*{box-sizing:border-box}
body{margin:0;font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif;background:#0b1220;color:#e5e7eb}
.top{position:sticky;top:0;z-index:10;background:rgba(2,6,23,0.9);backdrop-filter:blur(10px);border-bottom:1px solid rgba(255,255,255,0.08);padding:12px 14px;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.pill{background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.10);padding:8px 12px;border-radius:999px;font-weight:800;font-size:13px}
.btn{display:inline-block;text-decoration:none;color:#e5e7eb;background:rgba(59,130,246,0.18);border:1px solid rgba(59,130,246,0.35);padding:8px 12px;border-radius:999px;font-weight:900;font-size:13px;cursor:pointer}
.btn:hover{background:rgba(59,130,246,0.28)}
.btn2{background:rgba(34,197,94,0.18);border-color:rgba(34,197,94,0.35)}
.btn2:hover{background:rgba(34,197,94,0.28)}
.btn3{background:rgba(239,68,68,0.18);border-color:rgba(239,68,68,0.35)}
.btn3:hover{background:rgba(239,68,68,0.28)}
.btn4{background:rgba(168,85,247,0.18);border-color:rgba(168,85,247,0.35)}
.btn4:hover{background:rgba(168,85,247,0.28)}
.wrap{padding:16px;max-width:1400px;margin:0 auto}
.grid{display:grid;grid-template-columns:1.2fr 1fr;gap:16px}
@media(max-width:980px){.grid{grid-template-columns:1fr}}
.card{background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.08);border-radius:16px;overflow:hidden}
.card h3{margin:0;padding:14px 14px;border-bottom:1px solid rgba(255,255,255,0.08);font-size:14px;letter-spacing:0.2px}
.card .body{padding:14px}
.small{color:rgba(229,231,235,0.75);font-size:12px;line-height:1.5}
.imgbox{background:rgba(0,0,0,0.25);border:1px solid rgba(255,255,255,0.08);border-radius:14px;overflow:hidden;display:flex;align-items:center;justify-content:center;min-height:420px}
.imgbox img{max-width:100%;max-height:720px;display:block}
.pre{white-space:pre-wrap;background:rgba(0,0,0,0.18);border:1px solid rgba(255,255,255,0.08);border-radius:14px;padding:12px;min-height:220px;font-size:13px;line-height:1.45}
.kv{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px}
.kv .tag{background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.10);padding:6px 10px;border-radius:999px;font-weight:900;font-size:12px}
.err{color:#fca5a5;font-weight:800}
.ok{color:#86efac;font-weight:900}
a.link{color:#93c5fd;text-decoration:none}
a.link:hover{text-decoration:underline}
#autoStatus{display:inline-flex;align-items:center;gap:6px}
#autoStatus.active{color:#86efac}
#autoStatus.inactive{color:#fca5a5}
</style>
</head>
<body>

<div class="top">
  <span class="pill">ID: <?= (int)$contact['id'] ?></span>
  <span class="pill">Tel: <?= h($contact['telefono']) ?></span>
  <span class="pill">Nombre: <?= h($contact['nombre']) ?></span>
  <span class="pill">Nota: <?= h($notaActual ?: '-') ?></span>
  <span class="pill">Total contactos: <?= (int)$total ?></span>

  <?php if ($prevId): ?><a class="btn" href="revisar_categorias.php?cid=<?= (int)$prevId ?>">Anterior</a><?php endif; ?>
  <?php if ($nextId): ?><a class="btn btn2" href="revisar_categorias.php?cid=<?= (int)$nextId ?>">Siguiente</a><?php endif; ?>
  <a class="btn btn3" href="revisar_categorias.php?cid=<?= (int)$cid ?>&force=1">Reprocesar (force)</a>
  <button class="btn btn4" id="toggleAuto">Auto: OFF</button>
  <span class="pill" id="autoStatus" class="inactive">●</span>
</div>

<div class="wrap">
  <div class="grid">
    <div class="card">
      <h3>Flyer</h3>
      <div class="body">
        <div class="small">
          <?php if ($flyerMsg): ?>
            Primer flyer ID: <?= (int)$flyerMsg['id'] ?> |
            Fecha: <?= h($flyerMsg['fecha']) ?> |
            Dirección: <?= h($flyerMsg['direccion']) ?> |
            media_path: <?= h($flyerMediaPath) ?>
            <?php if ($flyerMediaUrl): ?> | <a class="link" href="<?= h($flyerMediaUrl) ?>" target="_blank">abrir</a><?php endif; ?>
          <?php else: ?>
            No hay mensajes en este contacto.
          <?php endif; ?>
        </div>

        <div class="imgbox" style="margin-top:12px;">
          <?php if ($mostrarComoImagen): ?>
            <img
              src="<?= h($flyerMediaUrl) ?>"
              alt="Flyer"
              loading="lazy"
              onerror="this.outerHTML='<div class=&quot;small err&quot; style=&quot;padding:18px;&quot;>No se pudo renderizar como imagen. <a class=&quot;link&quot; target=&quot;_blank&quot; href=&quot;<?= h($flyerMediaUrl) ?>&quot;>Abrir archivo</a></div>';"
            >
          <?php else: ?>
            <div class="small err" style="padding:18px;">No hay media_path para mostrar.</div>
          <?php endif; ?>
        </div>

        <?php if (!empty($flyerMsg['mensaje'])): ?>
          <div class="kv">
            <span class="tag">Mensaje ref: <?= h((string)$flyerMsg['mensaje']) ?></span>
          </div>
        <?php endif; ?>
      </div>
    </div>

    <div class="card">
      <h3>OCR + Categoría</h3>
      <div class="body">
        <div class="kv" style="margin-bottom:10px;">
          <?php if ($hacerProceso): ?>
            <span class="tag ok">Procesado</span>
          <?php else: ?>
            <span class="tag">Ya tiene nota (salteado)</span>
          <?php endif; ?>
          <span class="tag">Categoría: <?= h($notaActual ?: '-') ?></span>
        </div>

        <?php if ($ocrError): ?>
          <div class="small err">OCR: <?= h($ocrError) ?></div>
        <?php endif; ?>

        <div class="pre"><?= h($ocrText !== '' ? $ocrText : '(sin OCR o sin texto detectado)') ?></div>
      </div>
    </div>
  </div>
</div>

<script>
const nextId = <?= (int)$nextId ?>;
const toggleBtn = document.getElementById('toggleAuto');
const statusIndicator = document.getElementById('autoStatus');

// Recuperar estado de localStorage
let autoEnabled = localStorage.getItem('autoEnabled') === 'true';

function updateUI() {
  if (autoEnabled) {
    toggleBtn.textContent = 'Auto: ON';
    toggleBtn.classList.add('btn2');
    toggleBtn.classList.remove('btn4');
    statusIndicator.classList.add('active');
    statusIndicator.classList.remove('inactive');
  } else {
    toggleBtn.textContent = 'Auto: OFF';
    toggleBtn.classList.remove('btn2');
    toggleBtn.classList.add('btn4');
    statusIndicator.classList.remove('active');
    statusIndicator.classList.add('inactive');
  }
}

// Actualizar UI inicial
updateUI();

// Si auto está activado Y hay siguiente, avanzar automáticamente
if (autoEnabled && nextId > 0) {
  setTimeout(function() {
    window.location.href = 'revisar_categorias.php?cid=' + nextId;
  }, 1000);
}

// Toggle manual
toggleBtn.addEventListener('click', function() {
  autoEnabled = !autoEnabled;
  localStorage.setItem('autoEnabled', autoEnabled);
  updateUI();
  
  // Si se activó y hay siguiente, avanzar inmediatamente
  if (autoEnabled && nextId > 0) {
    setTimeout(function() {
      window.location.href = 'revisar_categorias.php?cid=' + nextId;
    }, 1000);
  }
});

// Si no hay siguiente, deshabilitar auto
if (nextId === 0) {
  toggleBtn.disabled = true;
  toggleBtn.style.opacity = '0.5';
  toggleBtn.style.cursor = 'not-allowed';
  // Desactivar auto si llegamos al final
  localStorage.setItem('autoEnabled', 'false');
}
</script>

</body>
</html>