<?php
/**
 * ASISMA CRM - Candado anti-duplicado de leads (regla definitiva 20-07-2026)
 *
 * Un lead se considera YA ATENDIDO si existe otro lead ABIERTO (ni ganado, ni
 * perdido, ni invalido) con el MISMO telefono en el MISMO segmento:
 *
 *   - Lead nuevo CON producto de interes → mismo region + vertical + PRODUCTO
 *     (un lead generico abierto de la misma marca tambien lo cubre).
 *   - Lead nuevo SIN producto (viene por marca) → mismo region + vertical + MARCA.
 *
 * Ademas, DENTRO del mismo franquiciado basta el telefono repetido: un
 * franquiciado no puede tener dos leads abiertos al mismo numero, aunque sea
 * en otro segmento. En otra region/vertical/marca u otro franquiciado, el
 * numero SI se puede repetir.
 *
 * El formato del numero no importa (+569..., 9..., con espacios o guiones):
 * se comparan los ultimos 8 digitos.
 */
class CandadoLeadsHelper {

    /**
     * Busca el lead abierto que ya atiende este telefono segun la regla.
     *
     * @param int|null $franquiciadoId Franquiciado que esta ingresando (null = matriz/API).
     * @return array|null Fila (id, franquiciado_id, mismo_franquiciado) del lead
     *                    que gatilla el candado, o null si se puede crear.
     */
    public static function leadAtendido($regionId, $verticalId, $marcaId, $productoId, $telefono, $franquiciadoId = null) {
        $db = Database::getInstance();

        $digitos = preg_replace('/[^0-9]/', '', (string)$telefono);
        if (strlen($digitos) < 8) return null; // sin numero comparable no hay candado
        $sufijo = '%' . substr($digitos, -8);

        // 1) Mismo franquiciado: el telefono repetido bloquea en cualquier segmento
        if ($franquiciadoId) {
            $propio = $db->fetchOne(
                "SELECT id, franquiciado_id FROM leads
                 WHERE franquiciado_id = :fid AND telefono_real LIKE :tel
                   AND activo = 1 AND estado_embudo NOT IN ('ganado', 'perdido', 'invalido')
                 ORDER BY id DESC LIMIT 1",
                array('fid' => (int)$franquiciadoId, 'tel' => $sufijo)
            );
            if ($propio) {
                $propio['mismo_franquiciado'] = true;
                return $propio;
            }
        }

        // 2) Regla global: mismo telefono + region + vertical + producto/marca.
        // En OTRA region el mismo cliente SI se puede repetir (confirmado por
        // Ivan el 20-07-2026: cada region es su propio mercado).
        if (!$regionId || !$verticalId) return null;

        $sql = "SELECT id, franquiciado_id FROM leads
                WHERE telefono_real LIKE :tel
                  AND region_id = :rid AND vertical_interes = :vid
                  AND activo = 1 AND estado_embudo NOT IN ('ganado', 'perdido', 'invalido')";
        $params = array('tel' => $sufijo, 'rid' => (int)$regionId, 'vid' => (int)$verticalId);

        if ($productoId) {
            // Mismo producto; un lead generico abierto de la misma marca lo cubre
            $sql .= " AND (producto_interes = :pid
                       OR (producto_interes IS NULL AND marca_interes = :mid))";
            $params['pid'] = (int)$productoId;
            $params['mid'] = (int)$marcaId;
        } elseif ($marcaId) {
            $sql .= " AND marca_interes = :mid_sola";
            $params['mid_sola'] = (int)$marcaId;
        }
        $sql .= " ORDER BY id DESC LIMIT 1";

        $fila = $db->fetchOne($sql, $params);
        if ($fila) {
            $fila['mismo_franquiciado'] = ($franquiciadoId && (int)$fila['franquiciado_id'] === (int)$franquiciadoId);
        }
        return $fila;
    }
}
