<?php
/**
 * ASISMA CRM - Constantes Globales
 * PHP 5.5 compatible: arrays via functions, not define()
 */

// Polyfill hash_equals (PHP < 5.6): comparación en tiempo constante
if (!function_exists('hash_equals')) {
    function hash_equals($known, $user) {
        if (!is_string($known) || !is_string($user)) return false;
        if (strlen($known) !== strlen($user)) return false;
        $result = 0;
        for ($i = 0; $i < strlen($known); $i++) {
            $result |= ord($known[$i]) ^ ord($user[$i]);
        }
        return $result === 0;
    }
}

// Formato canónico de RUT: sin puntos y CON guion (XXXXXXXX-D)
function normalizar_rut($rut) {
    $rut = strtoupper(preg_replace('/[^0-9kK]/', '', $rut));
    if (strlen($rut) < 2) return $rut;
    return substr($rut, 0, -1) . '-' . substr($rut, -1);
}

// Valida el dígito verificador del RUT (módulo 11); acepta con o sin puntos/guion
function validar_rut($rut) {
    $rut = strtoupper(preg_replace('/[^0-9kK]/', '', $rut));
    if (strlen($rut) < 2) return false;
    $numero = substr($rut, 0, -1);
    $dv     = substr($rut, -1);
    if (!ctype_digit($numero)) return false;
    $suma = 0;
    $factor = 2;
    for ($i = strlen($numero) - 1; $i >= 0; $i--) {
        $suma += (int)$numero[$i] * $factor;
        $factor = $factor == 7 ? 2 : $factor + 1;
    }
    $resto = 11 - ($suma % 11);
    $dvEsperado = $resto == 11 ? '0' : ($resto == 10 ? 'K' : (string)$resto);
    return $dv === $dvEsperado;
}

function normalizar_telefono($tel) {
    $tel = preg_replace('/[^\d+]/', '', $tel);
    return $tel;
}

function enmascarar_telefono($tel) {
    $tel = preg_replace('/[^0-9]/', '', $tel);
    $len = strlen($tel);
    if ($len <= 4) return str_repeat('*', $len);
    return substr($tel, 0, max(0, $len - 8)) . '****' . substr($tel, -4);
}

function enmascarar_correo($correo) {
    $partes = explode('@', $correo);
    if (count($partes) !== 2) return '****';
    $usr = $partes[0];
    $dom = $partes[1];
    $vis = strlen($usr) > 2 ? substr($usr, 0, 2) : $usr[0];
    return $vis . str_repeat('*', max(1, strlen($usr) - 2)) . '@' . $dom;
}

// ── Roles del Sistema ────────────────────────────────────────────────────────
define('ROL_ADMIN',        'admin');
define('ROL_FRANQUICIADO', 'franquiciado');
define('ROL_VENDEDOR',     'vendedor');
define('ROL_MARCA',        'marca');

function arr_roles() {
    return array(
        ROL_ADMIN        => 'Administrador General',
        ROL_FRANQUICIADO => 'Franquiciado',
        ROL_VENDEDOR     => 'Vendedor / Ejecutivo',
        ROL_MARCA        => 'Representante de Marca',
    );
}

// ── Módulos para gestión de Permisos ────────────────────────────────────────
function arr_modulos_permisos() {
    return array(
        'dashboard'     => 'Dashboard e Indicadores',
        'verticales'    => 'Mantenimiento de Verticales',
        'marcas'        => 'Mantenimiento de Marcas',
        'productos'     => 'Mantenimiento de Productos',
        'franquiciados' => 'Mantenimiento de Franquiciados',
        'usuarios'      => 'Gestión de Usuarios',
        'regiones'      => 'Gestión de Regiones',
        'leads'         => 'Gestión de Leads (Prospectos)',
        'empresas'      => 'Directorio de Empresas',
        'contactos'     => 'Directorio de Contactos',
        'cotizaciones'  => 'Creación y Envío de Cotizaciones',
        'actividades'   => 'Registro de Actividades CRM',
        'whatsapp'      => 'Integración de WhatsApp y Chat',
        'reportes'      => 'Reportes y Exportaciones',
        'cobros'        => 'Cobros por Lead (Monetización)',
        'configuracion' => 'Configuración de Sistema',
        'auditoria'     => 'Bitácora de Auditoría (Admin Only)',
        'operaciones'   => 'Operaciones y Post-Venta',
    );
}

// ── Orígenes de los Leads ────────────────────────────────────────────────────
function arr_origenes_lead() {
    return array(
        'web'               => 'Sitio Web Corporativo',
        'meta'              => 'Facebook / Instagram Ads',
        'whatsapp_directo'  => 'WhatsApp Directo',
        'manual'            => 'Ingreso Manual (Ejecutivo)',
        'api'               => 'API Externa',
        'referido'          => 'Referido',
        'control_empresas'  => 'Sincronización Control Empresas',
    );
}

// ── Estados del Embudo de Ventas ─────────────────────────────────────────────
define('ESTADO_NUEVO',      'nuevo');
define('ESTADO_ASIGNADO',   'asignado');
define('ESTADO_CONTACTADO', 'contactado');
define('ESTADO_COTIZADO',   'cotizado');
define('ESTADO_NEGOCIANDO', 'negociando');
define('ESTADO_FIRMA',      'firma');
define('ESTADO_GANADO',     'ganado');
define('ESTADO_PERDIDO',    'perdido');
define('ESTADO_INVALIDO',   'invalido');

// Colores de estado UNICOS para todo el sistema (revision UX 21-07-2026):
// tonos 400 pastel, legibles en tema oscuro y claro. Toda vista que pinte un
// estado debe usar estas claves centrales:
//   'texto' = solo el texto del color   'borde' = borde pastel (pills/cards)
//   'fila'  = borde izquierdo para marcar la fila completa de un listado
//   'color' = texto + borde (pills existentes)
function arr_estados_embudo() {
    $estados = array(
        ESTADO_NUEVO      => array('label' => 'Entrante / Nuevo',         'texto' => 'text-blue-400',   'borde' => 'border-blue-400/40',   'fila' => 'border-l-blue-400/60',   'hex' => '#60a5fa'),
        ESTADO_ASIGNADO   => array('label' => 'Asignado',                 'texto' => 'text-indigo-400', 'borde' => 'border-indigo-400/40', 'fila' => 'border-l-indigo-400/60', 'hex' => '#818cf8'),
        ESTADO_CONTACTADO => array('label' => 'Contactado',               'texto' => 'text-amber-400',  'borde' => 'border-amber-400/40',  'fila' => 'border-l-amber-400/60',  'hex' => '#fbbf24'),
        ESTADO_COTIZADO   => array('label' => 'Cotizado',                 'texto' => 'text-purple-400', 'borde' => 'border-purple-400/40', 'fila' => 'border-l-purple-400/60', 'hex' => '#c084fc'),
        ESTADO_NEGOCIANDO => array('label' => 'Negociando',               'texto' => 'text-orange-400', 'borde' => 'border-orange-400/40', 'fila' => 'border-l-orange-400/60', 'hex' => '#fb923c'),
        ESTADO_FIRMA      => array('label' => 'Firma / Contrato',         'texto' => 'text-cyan-400',   'borde' => 'border-cyan-400/40',   'fila' => 'border-l-cyan-400/60',   'hex' => '#22d3ee'),
        ESTADO_GANADO     => array('label' => 'Ganado / Venta Realizada', 'texto' => 'text-green-400',  'borde' => 'border-green-400/40',  'fila' => 'border-l-green-400/60',  'hex' => '#4ade80'),
        ESTADO_PERDIDO    => array('label' => 'Perdido',                  'texto' => 'text-red-400',    'borde' => 'border-red-400/40',    'fila' => 'border-l-red-400/60',    'hex' => '#f87171'),
        ESTADO_INVALIDO   => array('label' => 'Inválido / Duplicado',     'texto' => 'text-slate-400',  'borde' => 'border-slate-500/40',  'fila' => 'border-l-slate-500/60',  'hex' => '#94a3b8'),
    );
    foreach ($estados as $clave => $est) {
        $estados[$clave]['color'] = $est['texto'] . ' ' . $est['borde'];
    }
    return $estados;
}

// ── Motivos de Pérdida del Lead ──────────────────────────────────────────────
function arr_motivos_perdida() {
    return array(
        'precio'       => 'Precio muy elevado',
        'competencia'  => 'Se fue con la competencia',
        'sin_contacto' => 'Imposible contactar (datos erróneos)',
        'desistio'     => 'Cliente desistió del proyecto',
        'no_cumple'    => 'No cumple con requisitos técnicos',
        'otro'         => 'Otro motivo (especificar en notas)',
    );
}

// ── Tipos de Venta ───────────────────────────────────────────────────────────
define('TIPO_VENTA_UNICA',      'unica');
define('TIPO_VENTA_RECURRENTE', 'recurrente');
define('TIPO_VENTA_INVENTARIO', 'con_inventario');

function arr_tipos_venta() {
    return array(
        TIPO_VENTA_UNICA      => 'Venta Única',
        TIPO_VENTA_RECURRENTE => 'Suscripción / Recurrente',
        TIPO_VENTA_INVENTARIO => 'Venta con Inventario / Equipos',
    );
}

// ── Estados de Implementación ────────────────────────────────────────────────
define('OP_CREAR_CLIENTE', 'crear_cliente');
define('OP_IMPLEMENTACION', 'implementacion');
define('OP_CAPACITACION',  'capacitacion');
define('OP_OPERATIVO',     'operativo');
define('OP_CERRADO',       'cerrado');

function arr_estados_implementacion() {
    return array(
        OP_CREAR_CLIENTE => array('label' => 'Crear Ficha Cliente',         'color' => 'bg-slate-100 text-slate-700'),
        OP_IMPLEMENTACION=> array('label' => 'En Implementación',           'color' => 'bg-blue-100 text-blue-700'),
        OP_CAPACITACION  => array('label' => 'En Capacitación',             'color' => 'bg-amber-100 text-amber-700'),
        OP_OPERATIVO     => array('label' => 'Operativo / En Producción',   'color' => 'bg-green-100 text-green-700'),
        OP_CERRADO       => array('label' => 'Caso Cerrado',                'color' => 'bg-gray-100 text-gray-500'),
    );
}

// ── Folio de cotizaciones ────────────────────────────────────────────────────
/**
 * Folio visible de una cotización: si el documento ya existe en Control
 * Empresas se usa SU número (mismo folio en el CRM y en el facturador);
 * mientras no exista, el correlativo interno del CRM como respaldo.
 * Recibe la fila de la cotización (debe incluir ce_cotizacion_numero si viene
 * de un SELECT c.* / SELECT *).
 */
function folio_cotizacion($cotiz) {
    $numero = isset($cotiz['ce_cotizacion_numero']) ? trim((string)$cotiz['ce_cotizacion_numero']) : '';
    if ($numero === '' || $numero === '0') {
        $numero = isset($cotiz['id']) ? $cotiz['id'] : 0;
    }
    return 'COT-' . str_pad($numero, 6, '0', STR_PAD_LEFT);
}
