<?php
/* ============================================================
   submit.php — endpoint de ingesta de leads (equiv. al /api/submit
   de Vercel de plan-automotriz). Reenvía el lead al MISMO webhook
   de n8n → cae en el pipeline de Kommo de AGP.
   PHP-safe (sin sintaxis 8.x). Apache/PHP en el EC2.
   ============================================================ */
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json; charset=utf-8');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405); echo json_encode(array('error' => 'Method not allowed')); exit;
}

$N8N = 'https://n8n-n8n4.c4fnjq.easypanel.host/webhook/new-lead-kommo';

$raw  = file_get_contents('php://input');
$body = json_decode($raw, true);
if (!is_array($body)) { $body = array(); }

/* Enriquecido server-side (útil para atribución / anti-spam) */
$body['_ip']      = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
$body['_ua']      = isset($_SERVER['HTTP_USER_AGENT']) ? substr($_SERVER['HTTP_USER_AGENT'], 0, 240) : '';
$body['_host']    = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '';
$body['_referer'] = isset($_SERVER['HTTP_REFERER']) ? substr($_SERVER['HTTP_REFERER'], 0, 300) : '';
$body['_ts']      = gmdate('c');

/* Flatten de la atribución (utm_* / fbclid / gclid) a nivel top
   para que n8n/Kommo los mapee (igual que los hidden fields de FastLeads). */
if (isset($body['atribucion']) && is_array($body['atribucion'])) {
    foreach ($body['atribucion'] as $k => $v) {
        if (!isset($body[$k])) { $body[$k] = $v; }
    }
}

$payload = json_encode($body);

$ch = curl_init($N8N);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($payload)));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 8);
$resp   = curl_exec($ch);
$status = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$cerr   = curl_error($ch);
curl_close($ch);

/* CAPI server-side (Lead) — best-effort, corre DESPUES del forward a n8n
   para no demorar/romper la ingesta. Cierra la atribucion web->ad
   (fbclid->fbc->Lead con dedup por event_id contra el pixel del browser). */
$capi = array('sent' => false, 'skipped' => 'no_lib');
if (is_file(__DIR__ . '/capi.php')) {
    include_once __DIR__ . '/capi.php';
    if (function_exists('capi_send_lead')) {
        $capi = capi_send_lead($body);
    }
}
/* El resultado del CAPI se devolvia en el JSON y no se logueaba en ningun lado, o
   sea que su salud era INOBSERVABLE: no habia forma de saber si Meta esta
   recibiendo los eventos sin reproducir un lead a mano. Y hay indicio de que algo
   falla en la ruta real: una respuesta exitosa mide ~329 bytes, pero los 4 POST
   reales del access log devolvieron 838, 5472, 840 y 5472 — los ~5.100 bytes de
   mas solo pueden venir del campo 'error' de capi_post_one. Se loguea SIEMPRE
   (una linea por lead) para poder leer el motivo la proxima vez. */
error_log('CAPI ' . json_encode($capi));

if ($status >= 200 && $status < 300) {
    http_response_code(200);
    echo json_encode(array('ok' => true, 'capi' => $capi));
} else {
    error_log('n8n webhook error: ' . $status . ' ' . $resp . ' ' . $cerr);
    http_response_code(502);
    echo json_encode(array('error' => 'n8n', 'status' => $status, 'detail' => ($resp !== false ? $resp : $cerr), 'capi' => $capi));
}
