USE [Sis2000];
GO

IF OBJECT_ID('sp_TarjetaValidarTarjetaParaActivacion', 'P') IS NOT NULL
    DROP PROCEDURE sp_TarjetaValidarTarjetaParaActivacion;
GO

CREATE PROCEDURE sp_TarjetaValidarTarjetaParaActivacion
    @p_xcodigo_unico VARCHAR(8),
    @p_ccedula_cliente VARCHAR(50) = NULL,
    @p_xnombre_cliente VARCHAR(200) = NULL,
    @p_ntelefono_cliente VARCHAR(20) = NULL,
    @p_xsucursal_canal VARCHAR(250) = NULL,
    @p_cnpoliza VARCHAR(50) = NULL,
    @p_xfactura VARCHAR(50) = NULL,
    @p_xfoto_factura VARCHAR(250) = NULL,
    @p_cusuario VARCHAR(50) = 'SYSTEM',
    @p_resultado INT OUTPUT,
    @p_mensaje VARCHAR(200) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    
    DECLARE @v_ctarjeta INT;
    DECLARE @v_ctarlot INT;
    DECLARE @v_ccanalalt INT;
    DECLARE @v_cplan VARCHAR(10);
    DECLARE @v_cramos VARCHAR(6);
    DECLARE @v_iestado INT;
    DECLARE @v_factivacion DATETIME;
    DECLARE @v_xnombre_lote VARCHAR(200);
    DECLARE @v_xcanalalt VARCHAR(100);
    DECLARE @v_bfacturatar INT;
    DECLARE @v_cproducto CHAR(40);
    DECLARE @v_xform VARCHAR(50);
    DECLARE @v_plan_existe INT = 0;
    DECLARE @v_mmonto DECIMAL(12,2) = 0;
    DECLARE @v_nfactura_def VARCHAR(50) = ISNULL(@p_xfactura, 'TAR-' + @p_xcodigo_unico);
    
    -- 1. Buscar tarjeta por código único
    SELECT 
        @v_ctarjeta = ctarjeta, 
        @v_ctarlot = ctarlot, 
        @v_iestado = iestado, 
        @v_factivacion = factivacion
    FROM tatarjeta
    WHERE xcodigo_unico = @p_xcodigo_unico;
    
    IF @v_ctarjeta IS NULL
    BEGIN
        SET @p_resultado = 0; SET @p_mensaje = 'Tarjeta no encontrada'; RETURN;
    END
    
    IF @v_iestado = 0
    BEGIN
        SET @p_resultado = 0; SET @p_mensaje = 'Tarjeta anulada o inactiva'; RETURN;
    END
    
    IF @v_factivacion IS NOT NULL
    BEGIN
        IF @p_cnpoliza IS NOT NULL AND @p_cnpoliza <> '' AND @p_cnpoliza NOT LIKE 'TAR-%'
        BEGIN
            UPDATE tatarjeta SET cnpoliza = @p_cnpoliza WHERE ctarjeta = @v_ctarjeta;
            SET @p_resultado = 1; SET @p_mensaje = 'Póliza real vinculada con éxito';
        END
        ELSE
        BEGIN
            SET @p_resultado = 0; SET @p_mensaje = 'Tarjeta ya activada';
        END
        GOTO FINAL_DATA;
    END
    
    -- 2. Buscar datos del lote
    SELECT 
        @v_ccanalalt = L.ccanalalt, 
        @v_cplan = LTRIM(RTRIM(L.cplan)), 
        @v_cramos = LTRIM(RTRIM(L.cramos)),
        @v_xnombre_lote = L.xnombre_lote,
        @v_xcanalalt = C.xcanalalt,
        @v_bfacturatar = ISNULL(C.bfacturatar, 0)
    FROM tatarlot L
    LEFT JOIN macanalalt C ON L.ccanalalt = C.ccanalalt
    WHERE L.ctarlot = @v_ctarlot;
    
    DECLARE @v_nombre_plan VARCHAR(250);
 
    -- 3. Validar Plan
    SELECT TOP 1 @v_plan_existe = 1, @v_cproducto = cproducto, @v_nombre_plan = xplan 
    FROM maplanes_per 
    WHERE LTRIM(RTRIM(cplan)) = LTRIM(RTRIM(@v_cplan)) AND cramo = CAST(@v_cramos AS SMALLINT) AND iestado = 'V';
    
    IF @v_plan_existe = 0
    BEGIN
        SELECT TOP 1 @v_plan_existe = 1, @v_cproducto = cproducto, @v_nombre_plan = xplan 
        FROM maplanes 
        WHERE LTRIM(RTRIM(cplan)) = LTRIM(RTRIM(@v_cplan)) AND cramo = CAST(@v_cramos AS SMALLINT) AND iestado = 'V';
    END
 
    -- 4. Obtener Formulario Dinámico (Marketplace Logic)
    IF @v_cproducto IS NOT NULL
    BEGIN
        SELECT @v_xform = xform 
        FROM maproductos 
        WHERE cproducto = @v_cproducto;
    END
 
    -- FALLBACK ROBUSTO: Si no hay formulario por plan/producto, buscar por RAMO
    IF @v_xform IS NULL OR LTRIM(RTRIM(@v_xform)) = ''
    BEGIN
        SELECT TOP 1 @v_xform = xform 
        FROM maproductos 
        WHERE cramo = CAST(@v_cramos AS SMALLINT) 
          AND xform IS NOT NULL 
          AND xform <> ''
        ORDER BY cproducto; 
    END
 
    -- Si no hay formulario específico, usar 'persons' como fallback final
    SET @v_xform = ISNULL(NULLIF(LTRIM(RTRIM(@v_xform)), ''), 'persons');
 
    -- 5. Factura / Emisión
    IF @v_bfacturatar = 1
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM tafactura WHERE nfactura = @v_nfactura_def)
        BEGIN
            INSERT INTO tafactura (ccanalt, nfactura, ffactura, mmonto, iestado, fingreso, cusuario)
            VALUES (@v_ccanalalt, @v_nfactura_def, GETDATE(), @v_mmonto, 1, GETDATE(), @p_cusuario);
        END
        
        IF @p_cnpoliza IS NOT NULL AND @p_cnpoliza <> '' AND @p_cnpoliza NOT LIKE 'TAR-%'
        BEGIN
            UPDATE tatarjeta 
            SET cpoliza = @v_nfactura_def,
                cnpoliza = @p_cnpoliza,
                xfactura = @p_xfactura,
                xfoto_factura = @p_xfoto_factura,
                factivacion = GETDATE(),
                iestado = 2
            WHERE ctarjeta = @v_ctarjeta;
        END
    END
 
    -- 6. Respuesta Final
    DECLARE @v_nombre_final VARCHAR(250);
    
    -- Prioridad 1: Nombre del Plan
    SET @v_nombre_final = @v_nombre_plan;
 
    -- Prioridad 2: Nombre del Producto si no hay plan
    IF @v_nombre_final IS NULL OR @v_nombre_final = ''
    BEGIN
        IF @v_cproducto IS NOT NULL
        BEGIN
            SELECT @v_nombre_final = xdescripcion_l 
            FROM maproductos 
            WHERE LTRIM(RTRIM(cproducto)) = LTRIM(RTRIM(@v_cproducto));
        END
    END
 
    -- Fallback final: nombre del lote
    IF @v_nombre_final IS NULL OR @v_nombre_final = ''
    BEGIN
        SET @v_nombre_final = @v_xnombre_lote;
    END
 
    SET @p_resultado = 1;
    SET @p_mensaje = 'Tarjeta válida para activación';
 
FINAL_DATA:
    SELECT 
        @p_xcodigo_unico AS xcodigo_unico,
        @v_xform AS tipo_formulario,
        @v_cramos AS cramos,
        @v_cplan AS cplan,
        @v_ccanalalt AS ccanalalt,
        @v_ctarlot AS ctarlot,
        @v_xnombre_lote AS xnombre_lote,
        @v_xcanalalt AS xcanalalt,
        @v_cproducto AS cproducto,
        @v_nombre_final AS nombre_producto, -- Retornamos el Plan como "nombre_producto" para la UI
        @v_bfacturatar AS bfacturatar,
        @v_mmonto AS mmonto,
        @v_iestado AS estatus,
        @v_nfactura_def AS nfactura;
END
GO

PRINT 'SP sp_TarjetaValidarTarjetaParaActivacion creado exitosamente'
GO
