<?php
// 1. INICIO ABSOLUTO: Loguear
$logFile = __DIR__ . '/integration.log';
if (!function_exists('debug')) {
    function debug($msg) {
        global $logFile;
        $txt = date('H:i:s') . " " . (is_array($msg) ? json_encode($msg) : $msg) . "\n";
        file_put_contents($logFile, $txt, FILE_APPEND);
    }
}

// =========================================================
// HELPER: Extracción centralizada del código Walrus
// =========================================================
if (!function_exists('extraerCodigoAlfa')) {
    function extraerCodigoAlfa($prodInfo) {
        $raw = $prodInfo['PROPERTY_101'] ?? $prodInfo['PROPERTY_99'] ?? null;
        if (empty($raw)) return '';
        $cod = is_array($raw) ? (isset($raw['value']) ? $raw['value'] : reset($raw)) : $raw;
        return is_array($cod) ? array_shift($cod) : (string)$cod;
    }
}

try {
    $config = require 'config.php';
    require 'WalrusService.php';
    require 'BitrixService.php';

    $auth = $_REQUEST['auth']['application_token'] ?? '';
    if ($auth !== $config['bitrix']['app_token']) {
        die();
    }

    $event = $_REQUEST['event'] ?? '';
    $id    = $_REQUEST['data']['FIELDS']['ID'] ?? 0;

    // =========================================================
    // CASO 1: CLIENTE NUEVO
    // =========================================================
    if ($event === 'ONCRMCOMPANYADD') {
        sleep(2);
        $walrus  = new WalrusService($config);
        $bitrix  = new BitrixService($config);
        $company = $bitrix->call('crm.company.get', ['id' => $id])['result'];

        if (!empty($company['UF_CRM_1764535934'])) die();

        $nombreLimpio = mb_strtoupper(trim(html_entity_decode($company['TITLE'])));
        $rucLimpio    = !empty($company['UF_CRM_1764535962']) ? $company['UF_CRM_1764535962'] : '44444401-1';

        // Separar teléfono fijo y celular
        $telefono = '';
        $celular  = '';
        foreach (($company['PHONE'] ?? []) as $phone) {
            if ($phone['VALUE_TYPE'] === 'WORK' && empty($telefono)) {
                $telefono = $phone['VALUE'];
            }
            if ($phone['VALUE_TYPE'] === 'MOBILE' && empty($celular)) {
                $celular = $phone['VALUE'];
            }
        }
        // Si no hay separación por tipo, usar el primero disponible como teléfono
        if (empty($telefono) && empty($celular) && !empty($company['PHONE'][0]['VALUE'])) {
            $telefono = $company['PHONE'][0]['VALUE'];
        }

        $email     = $company['EMAIL'][0]['VALUE'] ?? '';

        // Buscar dirección: primero el campo personalizado, luego los estándar
        $direccion = '';
        foreach (['UF_CRM_1780942112', 'ADDRESS', 'REG_ADDRESS', 'ADDRESS_2', 'ADDRESS_LEGAL'] as $campoDir) {
            if (!empty($company[$campoDir])) {
                $direccion = $company[$campoDir];
                break;
            }
        }

        if (empty($direccion)) $direccion = 'Direccion Bitrix';

        // Obtener el agente: responsable asignado a la empresa
        $idResponsableEmpresa = $company['ASSIGNED_BY_ID'] ?? null;
        $idAgenteWalrus       = $config['walrus']['empleado_defecto'] ?? 319;
        if (!empty($idResponsableEmpresa)) {
            $datosAgente    = $bitrix->call('user.get', ['ID' => $idResponsableEmpresa])['result'][0] ?? [];
            $idAgenteWalrus = $datosAgente['UF_USR_1765885574936'] ?? $idAgenteWalrus;
        }

        // Mapas de conversión: Bitrix enumeration ID => código Walrus
                $mapaCiudades = [
            1487 => 1,  // BELEN
            1489 => 2,  // CONCEPCION
            1491 => 3,  // HORQUETA
            1493 => 4,  // LORETO
            1495 => 5,  // SAN CARLOS
            1497 => 6,  // SAN LAZARO
            1499 => 7,  // YBY YAU
            1501 => 8,  // ANTEQUERA
            1503 => 9,  // CAPIIBARY
            1505 => 10,  // CHORÉ
            1507 => 11,  // GENERAL ELIZARDO AQUINO
            1509 => 12,  // GENERAL ISIDORO RESQUÍN
            1511 => 13,  // GUAYAIBÍ
            1513 => 14,  // ITACURUBÍ DEL ROSARIO
            1515 => 15,  // LIMA
            1517 => 16,  // NUEVA GERMANIA
            1519 => 17,  // SAN ESTANISLAO
            1521 => 18,  // SAN PABLO
            1523 => 19,  // SAN PEDRO DEL YCUAMANDYYU
            1525 => 20,  // SANTA ROSA DEL AGUARAY
            1527 => 21,  // TACUATÍ
            1529 => 22,  // UNIÓN
            1531 => 23,  // VEINTICINCO DE DICIEMBRE
            1533 => 24,  // VILLA DEL ROSARIO
            1535 => 25,  // YATAITY DEL NORTE
            1537 => 26,  // YRYBUCUA
            1539 => 28,  // ALTOS
            1541 => 29,  // ARROYOS Y ESTEROS
            1543 => 30,  // ATYRA
            1545 => 31,  // CAACUPÉ
            1547 => 32,  // CARAGUATAY
            1549 => 33,  // EMBOSCADA
            1551 => 34,  // EUSEBIO AYALA
            1553 => 35,  // ISLA PUCÚ
            1555 => 36,  // ITACURUBÍ DE LA CORDILLERA
            1557 => 37,  // JUAN DE MENA
            1559 => 38,  // LOMA GRANDE
            1561 => 39,  // MBOCAYATY DEL YHAGUY
            1563 => 40,  // NUEVA COLOMBIA
            1565 => 41,  // PIRIBEBUY
            1567 => 42,  // PRIMERO DE MARZO
            1569 => 43,  // SAN BERNARDINO
            1571 => 44,  // SAN JOSÉ OBRERO
            1573 => 45,  // SANTA ELENA
            1575 => 46,  // TOBATÍ
            1577 => 47,  // VALENZUELA
            1579 => 48,  // BORJA
            1581 => 49,  // CAPITÁN MAURICIO JOSÉ TROCHE
            1583 => 50,  // CORONEL MARTÍNEZ
            1585 => 51,  // DR. BOTRELL
            1587 => 53,  // GENERAL EUGENIO A. GARAY
            1589 => 54,  // INDEPENDENCIA
            1591 => 55,  // ITAPÉ
            1593 => 56,  // ITURBE
            1595 => 57,  // JOSÉ A. FASSARDI
            1597 => 58,  // MBOCAYATY DEL GUAIRÁ
            1599 => 59,  // NATALICIO TALAVERA
            1601 => 60,  // ÑUMÍ
            1603 => 61,  // PASO YOBAI
            1605 => 62,  // SAN SALVADOR
            1607 => 63,  // TEBICUARY
            1609 => 64,  // VILLARRICA
            1611 => 65,  // YATAITY DEL GUAIRÁ
            1613 => 66,  // CAAGUAZÚ
            1615 => 67,  // CARAYAÓ
            1617 => 68,  // CORONEL OVIEDO
            1619 => 69,  // DR. CECILIO BÁEZ
            1621 => 70,  // DR. J. EULOGIO ESTIGARRIBIA - CAMPO9
            1623 => 71,  // DR. JUAN MANUEL FRUTOS
            1625 => 72,  // JOSÉ DOMINGO OCAMPOS
            1627 => 73,  // LA PASTORA
            1629 => 74,  // MARISCAL FRANCISCO SOLANO LÓPEZ
            1631 => 75,  // NUEVA LONDRES
            1633 => 76,  // RAÚL ARSENIO OVIEDO
            1635 => 77,  // REPATRIACIÓN
            1637 => 78,  // R.I. TRES CORRALES
            1639 => 79,  // SAN JOAQUÍN
            1641 => 80,  // SAN JOSÉ DE LOS ARROYOS
            1643 => 81,  // SANTA ROSA DEL MBUTUY
            1645 => 82,  // SIMÓN BOLÍVAR
            1647 => 83,  // TRES DE FEBRERO
            1649 => 84,  // VAQUERÍA
            1651 => 85,  // YHÚ
            1653 => 86,  // TEMBIAPORÀ
            1655 => 87,  // DR. BLÁS A. GARAY
            1657 => 88,  // ABAÍ
            1659 => 89,  // BUENA VISTA
            1661 => 90,  // CAAZAPÁ
            1663 => 91,  // DR. MOISÉS S. BERTONI
            1665 => 92,  // FULGENCIO YEGROS
            1667 => 93,  // GENERAL HIGINIO MORÍNIGO
            1669 => 94,  // MACIEL
            1671 => 95,  // SAN JUAN NEPOMUCENO
            1673 => 96,  // TAVAÍ
            1675 => 97,  // YUTY
            1677 => 98,  // ALTO VERÁ
            1679 => 99,  // BELLA VISTA
            1681 => 100,  // CAMBYRETÁ
            1683 => 101,  // CAPITÁN MEZA
            1685 => 102,  // CAPITÁN MIRANDA
            1687 => 103,  // CARLOS ANTONIO LÓPEZ
            1689 => 105,  // CORONEL BOGADO
            1691 => 106,  // EDELIRA
            1693 => 107,  // ENCARNACIÓN
            1695 => 108,  // FRAM
            1697 => 109,  // GENERAL ARTIGAS
            1699 => 110,  // GENERAL DELGADO
            1701 => 111,  // HOHENAU
            1703 => 112,  // ITAPÚA POTY
            1705 => 113,  // JESÚS
            1707 => 115,  // LA PAZ
            1709 => 116,  // MAYOR JULIO D. OTAÑO
            1711 => 117,  // NATALIO
            1713 => 118,  // NUEVA ALBORADA
            1715 => 119,  // OBLIGADO
            1717 => 120,  // PIRAPÓ
            1719 => 121,  // SAN COSME Y DAMIÁN
            1721 => 122,  // SAN JUAN DEL PARANÁ
            1723 => 123,  // SAN PEDRO DEL PARANÁ
            1725 => 124,  // SAN RAFAEL DEL PARANÁ
            1727 => 125,  // TOMÁS ROMERO PEREIRA - MA. AUXILIADORA
            1729 => 126,  // TRINIDAD
            1731 => 127,  // YATYTAY
            1733 => 128,  // AYOLAS
            1735 => 129,  // SAN IGNACIO
            1737 => 131,  // SAN MIGUEL
            1739 => 132,  // SAN PATRICIO
            1741 => 133,  // SANTA MARÍA
            1743 => 134,  // SANTA ROSA MISIONES
            1745 => 135,  // SANTIAGO
            1747 => 136,  // VILLA FLORIDA
            1749 => 137,  // YABEBYRY
            1751 => 138,  // ACAHAY
            1753 => 139,  // CAAPUCÚ
            1755 => 140,  // CARAPEGUÁ
            1757 => 142,  // GENERAL BERNARDINO CABALLERO
            1759 => 143,  // LA COLMENA
            1761 => 144,  // MBUYAPEY
            1763 => 145,  // PARAGUARÍ
            1765 => 146,  // PIRAYÚ
            1767 => 147,  // QUIINDY
            1769 => 149,  // SAN ROQUE GONZÁLEZ DE SANTA CRUZ
            1771 => 150,  // SAPUCAI
            1773 => 151,  // TEBICUARY-MÍ
            1775 => 152,  // YAGUARÓN
            1777 => 153,  // YBYCUÍ
            1779 => 154,  // YBYTYMÍ
            1781 => 156,  // CIUDAD DEL ESTE
            1783 => 157,  // DR. JUAN LEÓN MALLORQUÍN
            1785 => 159,  // HERNANDARIAS
            1787 => 160,  // IRUÑA
            1789 => 161,  // ITAKYRY
            1791 => 162,  // JUAN E. O LEARY
            1793 => 163,  // LOS CEDRALES
            1795 => 164,  // MBARACAYÚ
            1797 => 165,  // MINGA GUAZÚ
            1799 => 166,  // MINGA PORÁ
            1801 => 167,  // ÑACUNDAY
            1803 => 168,  // NARANJAL
            1805 => 169,  // PRESIDENTE FRANCO
            1807 => 170,  // SAN ALBERTO
            1809 => 171,  // SAN CRISTÓBAL
            1811 => 172,  // SANTA ROSA DEL MONDAY
            1813 => 173,  // SANTA RITA
            1815 => 174,  // YGUAZÚ
            1817 => 175,  // SANTA FE DEL PARANÁ
            1819 => 176,  // ASUNCION
            1821 => 177,  // LAMBARE
            1823 => 178,  // FERNANDO DE LA MORA
            1825 => 179,  // ÑEMBY
            1827 => 180,  // VILLA ELISA
            1829 => 181,  // SAN LORENZO
            1831 => 182,  // CAPIATA
            1833 => 183,  // LUQUE
            1835 => 184,  // AREGUA
            1837 => 185,  // LIMPIO
            1839 => 186,  // MARIANO ROQUE ALONSO
            1841 => 187,  // SAN ANTONIO
            1843 => 188,  // YPANE
            1845 => 189,  // VILLETA
            1847 => 190,  // YPACARAI
            1849 => 191,  // ITA
            1851 => 192,  // ITAUGUA
            1853 => 193,  // GUARAMBARE
            1855 => 194,  // NUEVA ITALIA
            1857 => 195,  // JUAN AUGUSTO SALDIVAR
            1859 => 196,  // ALBERDI
            1861 => 197,  // CERRITO
            1863 => 199,  // GENERAL JOSÉ EDUVIGIS DÍAZ
            1865 => 200,  // GUAZÚ CUÁ
            1867 => 201,  // HUMAITÁ
            1869 => 202,  // ISLA UMBÚ
            1871 => 203,  // LAURELES
            1873 => 204,  // MAYOR JOSÉ J. MARTÍNEZ
            1875 => 205,  // PASO DE PATRIA
            1877 => 206,  // PILAR
            1879 => 207,  // SAN JUAN BAUTISTA DEL ÑEEMBUCÚ
            1881 => 208,  // TACUARAS
            1883 => 209,  // VILLA FRANCA
            1885 => 210,  // VILLALBÍN
            1887 => 211,  // VILLA OLIVA
            1889 => 212,  // BELLA VISTA
            1891 => 213,  // CAPITAN BADO
            1893 => 214,  // PEDRO JUAN CABALLERO
            1895 => 215,  // CORPUS CHRISTI
            1897 => 217,  // GRAL. ÀLVAREZ DEL PUENTE KYJHÁ
            1899 => 218,  // ITANARÁ
            1901 => 219,  // KATUETÉ
            1903 => 220,  // LA PALOMA
            1905 => 221,  // NUEVA ESPERANZA
            1907 => 222,  // SALTO DEL GUAIRÁ
            1909 => 223,  // VILLA YGATIMÍ
            1911 => 224,  // YACY KAÑY
            1913 => 225,  // YPEJHÚ
            1915 => 226,  // VILLA HAYES
            1917 => 227,  // BENJAMÍN ACEVAL
            1919 => 228,  // PUERTO PINASCO
            1921 => 229,  // NANAWA
            1923 => 230,  // DR. JOSÉ FALCÓN
            1925 => 231,  // TTE. 1º MANUEL IRALA FERNÁNDEZ
            1927 => 232,  // TTE. ESTEBAN MARTÍNEZ
            1929 => 233,  // POZO COLORADO
            1931 => 234,  // GENERAL J. M. BRUGUÈZ
            1933 => 235,  // BAHIA NEGRA
            1935 => 236,  // FUERTE OLIMPO
            1937 => 237,  // PUERTO CASADO
            1939 => 238,  // CAP. CARMELO PERALTA
            1941 => 239,  // MAYOR PABLO LAGERENZA
            1943 => 240,  // DR. PEDRO P. PEÑA
            1945 => 241,  // GENERAL EUGENIO A. GARAY
            1947 => 243,  // FILADELFIA
            1949 => 244,  // BOQUERÓN
            1951 => 245,  // LOMA PLATA
            1953 => 246,  // COLONIA FERNHEIM
            1955 => 247,  // CARMEN DEL PARANA
            1957 => 248,  // CURUGUATY
            1959 => 249,  // LIBERACIÓN
            1961 => 250,  // NUEVA TOLEDO
            1963 => 251,  // DR. RAÚL PEÑA
            1965 => 252,  // J. EULOGIO ESTIGARRIBIA
            1967 => 253,  // AZOTEY
            1969 => 254,  // TAVAPY
            1971 => 255,  // MARISCAL JOSÉ FÉLIX ESTIGARRIBIA
            1973 => 256,  // NUEVA ASUNCIÓN
            1975 => 257,  // CAMPO ACEVAL
            1977 => 258,  // COLONIA BERGTHAL
            1979 => 259,  // TRONCAL 3
            1981 => 260,  // JOSÉ LEANDRO OVIEDO
            1983 => 261,  // SAN ALFREDO
            1985 => 262,  // MARACANÁ
            1987 => 263,  // YBYRAROBANÁ
            1989 => 264,  // SAN VICENTE PANCHOLO
            1991 => 265,  // SAN JOSÉ DEL ROSARIO
            1993 => 267,  // COLONIA JERUSALEN 2
            1995 => 268,  // COLONIA SANTA CLARA
            1997 => 269,  // SAN JUAN BAUTISTA
            1999 => 270,  // COLONIA TUPARENDA
            2001 => 271,  // RIO VERDE
            2003 => 272,  // YBY PYTA
            2005 => 273,  // ARROYITO
            2007 => 274,  // BUENOS AIRES
            2009 => 275,  // MONTEVIDEO
            2011 => 276,  // DOMINGO MARTÍNEZ DE IRALA
            2013 => 277,  // CLORINDA
            2015 => 278,  // FORMOSA
            2017 => 279,  // FOZ DO IGUACU
            2019 => 280,  // SAO PAULO
            2021 => 281,  // RIO DE JANEIRO
            2023 => 282,  // PONTA PORA
        ];

        $mapaZonas = [
            589 => 1,  // CLIENTES ALTA S.A.
            591 => 2,  // GERENCIA CAPITAL
            593 => 3,  // GERENCIA INTERIOR
            595 => 4,  // EMPLEADOS
            597 => 5,  // TELEVENTAS CENTRAL 1
            599 => 6,  // TELEVENTAS CENTRAL 2
            601 => 7,  // TELEVENTAS CENTRAL 3
            603 => 8,  // TELEVENTAS INTERIOR 1
            605 => 9,  // TELEVENTAS INTERIOR 2
            607 => 10,  // TELEVENTAS INTERIOR 3
            609 => 11,  // 2º ANILLO (1)
            611 => 12,  // 2º ANILLO (2)
            613 => 13,  // 2º ANILLO (3)
            615 => 14,  // ASUNCION 1
            617 => 15,  // ASUNCION 2
            619 => 16,  // CHACO
            621 => 17,  // LAMBARÉ/FNDO
            623 => 18,  // LUQUE
            625 => 19,  // ÑEMBY
            627 => 20,  // SAN LORENZO 1
            629 => 21,  // SAN LORENZO 2
            631 => 22,  // TRANSCHACO
            633 => 23,  // V. HAYES/B. ACEVAL
            635 => 24,  // SALON 1
            637 => 25,  // SALON 2
            639 => 26,  // SALON 3
            641 => 27,  // SANITARIOS1
            643 => 28,  // SANITARIOS2
            645 => 29,  // SANITARIOS3
            647 => 30,  // ESPECIALISTA1
            649 => 31,  // CORPORATIVO2
            651 => 32,  // CORPORATIVO3
            653 => 33,  // CORPORATIVO4
            655 => 34,  // CORPORATIVO5
            657 => 35,  // CORPORATIVO6
            659 => 36,  // TMK1
            661 => 37,  // TMK2
            663 => 38,  // TMK3
            665 => 39,  // TMK4
            667 => 40,  // TMK5
            669 => 41,  // TMK6
            671 => 42,  // TMK7
            673 => 43,  // ESTE 2
            675 => 44,  // ESTE 3
            677 => 45,  // ESTE 4
            679 => 46,  // ESTE 5
            681 => 47,  // ESTE 6
            683 => 48,  // NORTE 1
            685 => 49,  // NORTE 2
            687 => 50,  // NORTE 3
            689 => 51,  // OESTE 1
            691 => 52,  // OESTE 2
            693 => 53,  // OESTE 3
            695 => 54,  // OESTE 4
            697 => 55,  // OESTE 5
            699 => 56,  // SUR 1
            701 => 57,  // SUR 2
            703 => 58,  // TMK8
            705 => 59,  // TMK9
            707 => 60,  // TMK10
            709 => 61,  // SALON 4
            711 => 62,  // ESPECIALISTA2
            713 => 63,  // TELEVENTAS INTERIOR 4
            715 => 64,  // SUR 3
            717 => 65,  // SALON 5
            719 => 66,  // ESTE 7
            721 => 67,  // 2º ANILLO (4)
            723 => 68,  // TRANSCHACO2
            725 => 69,  // VENTAS SANITARIOS
            727 => 70,  // 2º ANILLO (4)
            729 => 71,  // CONSTRUCCIONES1
            731 => 72,  // SALON 6
        ];

        $mapaFormaPago = [
            731 => 1,  // CF 6M
            733 => 2,  // CF 5M
            735 => 3,  // CF 4M
            737 => 4,  // CF 3M
            739 => 5,  // CF 2M
            741 => 6,  // CF 1M
            743 => 7,  // CF Cont
            745 => 8,  // DC 1M
            747 => 9,  // DC 2M
            749 => 10,  // DC 3M
            751 => 11,  // DI 1M
            753 => 12,  // DI 2M
            755 => 13,  // DI 3M
            757 => 14,  // DI Cont
            759 => 15,  // DC Cont
            761 => 16,  // CORP 1M
            763 => 17,  // CORP Cont
            765 => 18,  // DC 0M
            767 => 19,  // DI 0M
            769 => 20,  // CORP 90D
        ];

        // Leer campos de lista y convertir a código Walrus
        // Leer ciudad (isMultiple=false, viene como entero)
        $ciudadBitrixId = (int)($company['UF_CRM_1780930961'] ?? 0);
        $zonaBitrixId   = (int)($company['UF_CRM_1780679486'] ?? 0);
        $pagoBitrixId   = (int)($company['UF_CRM_1780679517'] ?? 0);

        $ciudadWalrus = $mapaCiudades[$ciudadBitrixId] ?? 1;
        $zonaWalrus   = $mapaZonas[$zonaBitrixId]     ?? 1;
        $pagoWalrus   = $mapaFormaPago[$pagoBitrixId] ?? 7;

        $datos = [
            "p_clpr_ruc"             => $rucLimpio,
            "p_clpr_desc"            => $nombreLimpio,
            "p_clpr_tele"            => $telefono,
            "p_clpr_celu"            => $celular,
            "p_clpr_email"           => $email,
            "p_clpr_dire"            => $direccion,
            "p_clpr_pers_cont"       => $nombreLimpio,
            "p_clpr_empl_codi"       => (int)$idAgenteWalrus,
            "p_clpr_ciud_codi"       => $ciudadWalrus,
            "p_clpr_zona_codi"       => $zonaWalrus,
            "p_clpr_orte_codi"       => $pagoWalrus,
            "p_clpr_clie_clas1_codi" => 1
        ];

        // Validar formato RUC antes de enviar
        if (!empty($rucLimpio) && $rucLimpio !== '44444401-1' && strpos($rucLimpio, '-') === false) {
            debug("⚠️ RUC sin formato correcto (falta guion): $rucLimpio. Se usa RUC genérico.");
            $rucLimpio = '44444401-1';
            $datos['p_clpr_ruc'] = $rucLimpio;
        }

        debug("➡️ Enviando a Walrus createCliente: " . json_encode($datos));
        $res = $walrus->createCliente($datos);
        debug("⬅️ Respuesta Walrus createCliente: " . json_encode($res));

        if ($res && isset($res['clpr_codi_alte'])) {
            $bitrix->call('crm.company.update', [
                'id'     => $id,
                'fields' => ['UF_CRM_1764535934' => $res['clpr_codi_alte']]
            ]);
            debug("✅ Cliente Creado OK. ID: " . $res['clpr_codi_alte']);
        } else {
            $errMsg = $res['message'] ?? $res['error'] ?? 'Error desconocido';
            debug("❌ Error al crear cliente en Walrus: $errMsg");
        }
    }

    // =========================================================
    // CASO 2: ACTUALIZACIÓN DEAL
    // =========================================================
    if ($event === 'ONCRMDEALUPDATE') {

        $walrus = new WalrusService($config);
        $bitrix = new BitrixService($config);
        sleep(1);

        $deal  = $bitrix->call('crm.deal.get', ['id' => $id])['result'];
        $stage = $deal['STAGE_ID'];

        // --- CONFIGURACIÓN DE ETAPAS ---
        $etapasParaCotizar = [
            'NEW', 'PREPARATION', 'UC_QF4MMM', 'PREPAYMENT_INVOICE',
            'C1:NEW', 'C1:PREPARATION', 'C1:PREPAYMENT_INVOICE',
            'C5:NEW', 'C5:PREPARATION', 'C5:PREPAYMENT_INVOICE',
            'C7:NEW', 'C7:PREPARATION', 'C7:PREPAYMENT_INVOICE',
            'C9:NEW', 'C9:PREPARATION', 'C9:PREPAYMENT_INVOICE',
            'EXECUTING'
        ];
        $etapasGanadas = ['UC_OZ6QWF', 'WON', 'C1:WON', 'C5:WON', 'C7:WON', 'C9:WON'];
        $campoPedido   = 'UF_CRM_1764536647';

        // Si la etapa no nos interesa, salir de inmediato
        if (!in_array($stage, $etapasParaCotizar) && !in_array($stage, $etapasGanadas)) {
            debug("ℹ️ Etapa '$stage' no requiere procesamiento. Ignorado.");
            die();
        }

        // --- ID CLIENTE ---
        $idClienteGenerico = 1;
        $companyId         = $deal['COMPANY_ID'];
        $idClienteWalrus   = null;

        if (!empty($companyId)) {
            $company         = $bitrix->call('crm.company.get', ['id' => $companyId])['result'];
            $idClienteWalrus = $company['UF_CRM_1764535934'] ?? null;
        }

        if (empty($idClienteWalrus)) {
            $idClienteWalrus = $idClienteGenerico;
            debug("⚠️ Usando Cliente Genérico ($idClienteGenerico).");
        }

        $rows = $bitrix->call('crm.deal.productrows.get', ['id' => $id])['result'];
        if (empty($rows)) die();

        // =========================================================
        // GUARD ANTI-LOOP: Hash de estado por deal (archivo local)
        // =========================================================
        $stateFile  = __DIR__ . "/state/state_deal_{$id}.json";
        if (!is_dir(__DIR__ . "/state")) mkdir(__DIR__ . "/state", 0755, true);
        $stateData  = ['stage' => $stage, 'rows' => []];
        foreach ($rows as $r) {
            $stateData['rows'][] = [
                'id'   => $r['PRODUCT_ID'],
                'qty'  => $r['QUANTITY'],
                'disc' => $r['DISCOUNT_RATE'] ?? 0,
            ];
        }
        $hashActual     = md5(json_encode($stateData));
        $estadoGuardado = file_exists($stateFile) ? json_decode(file_get_contents($stateFile), true) : [];
        $hashAnterior   = $estadoGuardado['hash'] ?? '';

        if ($hashActual === $hashAnterior) {
            debug("ℹ️ Sin cambios reales en deal #$id. Ignorado.");
            die();
        }

        // Guardar nuevo estado ANTES de procesar para cortar reentradas
        $escritura = file_put_contents($stateFile, json_encode([
            'hash'  => $hashActual,
            'stage' => $stage,
            'ts'    => date('Y-m-d H:i:s')
        ]));
        if ($escritura === false) {
            debug("🔥 ERROR: No se pudo escribir el archivo de estado: $stateFile");
        } else {
            debug("💾 Estado guardado: $stateFile (hash: $hashActual)");
        }

        // =========================================================
        // ESCENARIO A: COTIZAR
        // =========================================================
        if (in_array($stage, $etapasParaCotizar)) {
            debug(">>> COTIZANDO DEAL #$id...");

            $productosParaActualizar = [];
            $huboCambios             = false;
            $mensajeReporte          = "💰 [B]Resumen de Cotización Walrus[/B]\n\n";
            $hayDatosParaReporte     = false;

            foreach ($rows as $row) {
                $prodInfo       = $bitrix->call('crm.product.get', ['id' => $row['PRODUCT_ID']])['result'];
                $nombreProducto = $row['PRODUCT_NAME'];
                $codAlfa        = extraerCodigoAlfa($prodInfo);

                if (empty($codAlfa)) {
                    $mensajeReporte .= "❌ [B]{$nombreProducto}[/B]\n   Sin código Walrus\n\n";
                    $productosParaActualizar[] = $row;
                    continue;
                }

                try {
                    $resPrecio          = $walrus->calcularPrecio($idClienteWalrus, $codAlfa);
                    $precioListaWalrus  = (float)($resPrecio['prec_unit_list'] ?? 0);
                    $maxDescuentoWalrus = (float)($resPrecio['porc_deto']      ?? 0);

                    if (isset($resPrecio['prec_max_deto'])) {
                        $descuentoVendedor = (float)($row['DISCOUNT_RATE'] ?? 0);
                        $alertaExceso      = ($descuentoVendedor > 0 && $descuentoVendedor > $maxDescuentoWalrus);

                        $precioActual = (float)$row['PRICE'];
                        $descActual   = (float)$row['DISCOUNT_RATE'];

                        // Si el vendedor ya puso un descuento manual, respetarlo.
                        // Si no hay descuento (0), aplicar el máximo de Walrus.
                        $descuentoFinal = $descActual > 0 ? $descActual : $maxDescuentoWalrus;

                        if (abs($precioActual - $precioListaWalrus) > 0.01 || abs($descActual - $descuentoFinal) > 0.01) {
                            $row['PRICE']         = round($precioListaWalrus, 2);
                            $row['DISCOUNT_RATE'] = $descuentoFinal;
                            $huboCambios          = true;
                            debug("--> ACTUALIZADO: Lista $precioListaWalrus | Desc $descuentoFinal%");
                        }
                    }

                    $stockMsg = "❓ Sin datos";
                    if (isset($resPrecio['stoc_actu'])) {
                        $stockVal = (float)$resPrecio['stoc_actu'];
                        $stockMsg = $stockVal > 0
                            ? "✅ Disp: $stockVal"
                            : "🚫 [COLOR=#FF0000][B]Sin Stock[/B][/COLOR]";
                    }

                    $mensajeReporte .= "🔹 [B]{$nombreProducto}[/B]\n";
                    $mensajeReporte .= "   🏷️ Lista: ₲ " . number_format($precioListaWalrus, 0, ',', '.') . "\n";

                    if ($alertaExceso) {
                        $mensajeReporte .= "   ⚠️ [COLOR=#FF9900]Desc. Vendedor: {$descuentoVendedor}% (Supera máx: {$maxDescuentoWalrus}%)[/COLOR]\n";
                    } else {
                        $mensajeReporte .= "   ✅ Desc. máx aplicado: {$maxDescuentoWalrus}%\n";
                    }
                    $mensajeReporte     .= "   📦 Stock: {$stockMsg}\n\n";
                    $hayDatosParaReporte = true;

                } catch (Exception $w) {
                    $mensajeReporte .= "⚠️ [B]{$nombreProducto}[/B]: Error conexión\n\n";
                }

                $productosParaActualizar[] = $row;
            }

            if ($huboCambios) {
                $stateDataActualizada = ['stage' => $stage, 'rows' => []];
                foreach ($productosParaActualizar as $r) {
                    $stateDataActualizada['rows'][] = [
                        'id'   => $r['PRODUCT_ID'],
                        'qty'  => $r['QUANTITY'],
                        'disc' => $r['DISCOUNT_RATE'] ?? 0,
                    ];
                }
                file_put_contents($stateFile, json_encode([
                    'hash'  => md5(json_encode($stateDataActualizada)),
                    'stage' => $stage,
                    'ts'    => date('Y-m-d H:i:s')
                ]));

                $bitrix->call('crm.deal.productrows.set', ['id' => $id, 'rows' => $productosParaActualizar]);
                debug("✅ Precios actualizados en Bitrix.");
            } else {
                debug("ℹ️ Sin cambios en precios.");
            }

            if ($hayDatosParaReporte) {
                $bitrix->call('crm.timeline.comment.add', [
                    'fields' => [
                        "ENTITY_ID"   => $id,
                        "ENTITY_TYPE" => "DEAL",
                        "COMMENT"     => $mensajeReporte
                    ]
                ]);
            }
        }

        // =========================================================
        // ESCENARIO B: PEDIDO (GANADA)
        // =========================================================
        elseif (in_array($stage, $etapasGanadas)) {
            if (!empty($deal[$campoPedido])) die();

            debug(">>> INTENTANDO CREAR PEDIDO...");

            $idResponsable       = $deal['ASSIGNED_BY_ID'];
            $datosUsuario        = $bitrix->call('user.get', ['ID' => $idResponsable])['result'][0];
            $idEmpleadoWalrus    = $datosUsuario['UF_USR_1765885574936'] ?? $config['walrus']['empleado_defecto'] ?? 319;
            $usuarioBitrixWalrus = (string)($datosUsuario['ID'] ?? '');

            $valorListaBitrix     = $deal['UF_CRM_1765891818635'] ?? null;
            $tipoMovimientoWalrus = 1;
            $mapaMovimientos      = ['45' => 1, '47' => 2];
            if (isset($mapaMovimientos[$valorListaBitrix])) {
                $tipoMovimientoWalrus = $mapaMovimientos[$valorListaBitrix];
            }

            $detalleItems             = [];
            $productosSinStock        = [];
            $productosConDescExcedido = [];
            $i = 1;

            foreach ($rows as $row) {
                $prodInfo = $bitrix->call('crm.product.get', ['id' => $row['PRODUCT_ID']])['result'];
                $codiAlfa = extraerCodigoAlfa($prodInfo);
                if (empty($codiAlfa)) $codiAlfa = "0";

                $descVendedor  = (float)($row['DISCOUNT_RATE'] ?? 0);
                $maxDescPedido = 0;

                if ($codiAlfa !== "0") {
                    try {
                        $resPrecio     = $walrus->calcularPrecio($idClienteWalrus, $codiAlfa);
                        $stockVal      = (float)($resPrecio['stoc_actu'] ?? 0);
                        $maxDescPedido = (float)($resPrecio['porc_deto'] ?? 0);

                        if ($stockVal < (float)$row['QUANTITY']) {
                            $productosSinStock[] = "{$row['PRODUCT_NAME']} (Pedido: {$row['QUANTITY']}, Stock: $stockVal)";
                        }

                        if ($descVendedor > $maxDescPedido) {
                            $productosConDescExcedido[] = "{$row['PRODUCT_NAME']} (Solicitado: {$descVendedor}%, Máx: {$maxDescPedido}%)";
                        }
                    } catch (Exception $e) {
                        debug("⚠️ Error consultando stock de {$row['PRODUCT_NAME']}");
                        $productosSinStock[] = "{$row['PRODUCT_NAME']} (error de conexión)";
                    }
                }

                $obsItem = $descVendedor > 0 ? "Desc Solicitado: {$descVendedor}%" : "";

                $detalleItems[] = [
                    "p_dpre_nume_item"      => $i,
                    "p_dpre_prod_codi_alfa" => (string)$codiAlfa,
                    "p_dpre_prod_codi_barr" => (string)$codiAlfa,
                    "p_dpre_cant"           => (float)$row['QUANTITY'],
                    "p_dpre_prec_unit_list" => (float)$row['PRICE'],
                    "p_dpre_porc_deto"      => $descVendedor,
                    "p_dpre_obse"           => $obsItem
                ];
                $i++;
            }

            if (!empty($productosSinStock)) {
                $lista = implode("\n   • ", $productosSinStock);
                reportarErrorBitrix($bitrix, $id,
                    "⚠️ Atención: Los siguientes productos no tienen stock suficiente pero el pedido fue enviado:\n   • {$lista}"
                );
                debug("⚠️ Sin stock en algunos productos, pero se envía el pedido igual.");
            }

            $pedidoJSON = [
                "p_pres_clpr_codi_alte" => (int)$idClienteWalrus,
                "p_pres_empl_codi"      => (int)$idEmpleadoWalrus,
                "p_pres_timo_codi"      => (int)$tipoMovimientoWalrus,
                "p_pres_user"           => $usuarioBitrixWalrus,
                "p_pres_form_entr_codi" => 2,
                "p_pres_obse"           => "Pedido Bitrix #" . $id . (!empty($deal["COMMENTS"]) ? " | " . $deal["COMMENTS"] : ""),
                "p_pres_tipo"           => "A",
                "p_pres_obse_dcto"      => !empty($productosConDescExcedido)
                    ? "Solicitud de revisión de descuento: " . implode(" | ", $productosConDescExcedido)
                    : ($deal["UF_CRM_1775583082"] ?? ""),
                "detalle"               => $detalleItems
            ];

            $res = $walrus->registrarPedido($pedidoJSON);

            if (isset($res['pedidos'][0]['pres_nume'])) {
                $nroPedido = $res['pedidos'][0]['pres_nume'];
                $bitrix->call('crm.deal.update', [
                    'id'     => $id,
                    'fields' => [$campoPedido => $nroPedido]
                ]);
                $bitrix->call('crm.timeline.comment.add', [
                    'fields' => [
                        "ENTITY_ID"   => $id,
                        "ENTITY_TYPE" => "DEAL",
                        "COMMENT"     => "✅ [B]Pedido Walrus Generado Exitosamente[/B]\nNro: {$nroPedido}"
                    ]
                ]);
                debug("✅ PEDIDO CREADO: $nroPedido");
            } else {
                $errMsg = $res['message'] ?? $res['error'] ?? 'Error desconocido';
                reportarErrorBitrix($bitrix, $id, "Fallo al crear pedido: $errMsg");
            }
        }
    }

} catch (Throwable $e) {
    $err = date('H:i:s') . " ERROR PHP: " . $e->getMessage() . "\n";
    file_put_contents(__DIR__ . '/integration.log', $err, FILE_APPEND);
}

function reportarErrorBitrix($bitrix, $dealId, $msg) {
    $historial = $bitrix->call('crm.timeline.comment.list', [
        'filter' => ["ENTITY_ID" => $dealId, "ENTITY_TYPE" => "DEAL"],
        'order'  => ["ID" => "DESC"],
        'select' => ["COMMENT", "CREATED"]
    ]);

    $nuevoComentario  = "🚫 [COLOR=#FF0000][B]AVISO DE SISTEMA[/B][/COLOR]\n{$msg}";
    $ultimoComentario = $historial['result'][0]['COMMENT'] ?? '';

    if (trim($ultimoComentario) === trim($nuevoComentario)) return;

    $bitrix->call('crm.timeline.comment.add', [
        'fields' => [
            "ENTITY_ID"   => $dealId,
            "ENTITY_TYPE" => "DEAL",
            "COMMENT"     => $nuevoComentario
        ]
    ]);
}
?>
0 * * * * /usr/bin/php /var/www/bitrix/sync.php >> /var/www/bitrix/sync.log 2>&1
