-- =============================================
-- MASTER DEPLOYMENT SCRIPT: Card Module Stored Procedures
-- Prefijo: "Tarjeta" para organización y consistencia.
-- =============================================

USE Sis2000;
GO

PRINT '---------------------------------------------------------';
PRINT 'Iniciando despliegue de PROCEDIMIENTOS ALMACENADOS';
PRINT 'Módulo: Tarjetas (Lotes y Activación)';
PRINT '---------------------------------------------------------';
GO

-- 1. sp_TarjetaRegistrarLogProceso
-- =============================================
IF OBJECT_ID('sp_TarjetaRegistrarLogProceso', 'P') IS NOT NULL DROP PROCEDURE sp_TarjetaRegistrarLogProceso;
GO
CREATE PROCEDURE sp_TarjetaRegistrarLogProceso
    @p_ctarjeta INT,
    @p_xcodigo_tarjeta VARCHAR(8),
    @p_ccanal INT,
    @p_itipo_accion VARCHAR(20),
    @p_xestado_proceso VARCHAR(10),
    @p_xendpoint_api VARCHAR(200),
    @p_xdatos_peticion VARCHAR(MAX),
    @p_xdatos_respuesta VARCHAR(MAX),
    @p_xmensaje_error VARCHAR(MAX),
    @p_ncodigo_http INT,
    @p_xdireccion_ip VARCHAR(45)
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO taproceso_log (ctarjeta, xcodigo_tarjeta, ccanal, itipo_accion, xestado_proceso, xendpoint_api, xdatos_peticion, xdatos_respuesta, xmensaje_error, ncodigo_http, xdireccion_ip, fproceso)
    VALUES (@p_ctarjeta, @p_xcodigo_tarjeta, @p_ccanal, @p_itipo_accion, @p_xestado_proceso, @p_xendpoint_api, @p_xdatos_peticion, @p_xdatos_respuesta, @p_xmensaje_error, @p_ncodigo_http, @p_xdireccion_ip, GETDATE());
END
GO
PRINT '✔ 1. sp_TarjetaRegistrarLogProceso: OK';

-- 2. sp_TarjetaGestionar
-- =============================================
IF OBJECT_ID('sp_TarjetaGestionar', 'P') IS NOT NULL DROP PROCEDURE sp_TarjetaGestionar;
GO
CREATE PROCEDURE sp_TarjetaGestionar
    @p_operacion VARCHAR(20),
    @p_nro_tarjeta VARCHAR(8) = NULL,
    @p_xcodigo_unico VARCHAR(8) = NULL,
    @p_ctarlot INT = NULL,
    @p_cusuario VARCHAR(50),
    @p_xdireccion_ip VARCHAR(45) = NULL,
    @p_resultado VARCHAR(MAX) = NULL OUTPUT,
    @p_codigo_http INT = 200 OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @v_datos_peticion VARCHAR(MAX), @v_mensaje_error VARCHAR(MAX), @v_ctarjeta INT, @v_xcodigo VARCHAR(8), @v_ccanal INT, @v_tipo_accion VARCHAR(20);
    DECLARE @v_json_base VARCHAR(MAX) = '{"operacion":"' + @p_operacion + '"';
    DECLARE @v_json_nro VARCHAR(MAX) = CASE WHEN @p_nro_tarjeta IS NOT NULL THEN ',"nro_tarjeta":"' + @p_nro_tarjeta + '"' ELSE '' END;
    DECLARE @v_json_codigo VARCHAR(MAX) = CASE WHEN @p_xcodigo_unico IS NOT NULL THEN ',"codigo":"' + @p_xcodigo_unico + '"' ELSE '' END;
    DECLARE @v_json_lote VARCHAR(MAX) = CASE WHEN @p_ctarlot IS NOT NULL THEN ',"lote":' + CAST(@p_ctarlot AS VARCHAR) ELSE '' END;
    SET @v_datos_peticion = @v_json_base + @v_json_nro + @v_json_codigo + @v_json_lote + ',"usuario":"' + @p_cusuario + '"}';
    
    IF @p_operacion NOT IN ('VALIDAR', 'CREAR', 'ELIMINAR') BEGIN
        SET @p_resultado = '{"status":"ERROR","message":"Operación no válida"}'; SET @p_codigo_http = 400; RETURN;
    END
    
    BEGIN TRY
        IF @p_operacion = 'VALIDAR' BEGIN
            SET @v_tipo_accion = 'VALIDAR_TARJETA';
            IF @p_nro_tarjeta IS NOT NULL BEGIN
                SELECT @v_ctarjeta = ctarjeta, @v_xcodigo = xcodigo_unico, @v_ccanal = L.ccanalalt FROM tatarjeta T INNER JOIN tatarlot L ON L.ctarlot = T.ctarlot WHERE T.nro_tarjeta = @p_nro_tarjeta;
            END ELSE IF @p_xcodigo_unico IS NOT NULL BEGIN
                SELECT @v_ctarjeta = ctarjeta, @v_xcodigo = xcodigo_unico, @v_ccanal = L.ccanalalt FROM tatarjeta T INNER JOIN tatarlot L ON L.ctarlot = T.ctarlot WHERE T.xcodigo_unico = @p_xcodigo_unico;
            END
            
            IF @v_ctarjeta IS NOT NULL BEGIN
                SELECT T.ctarjeta, T.xcodigo_unico, T.iestado as estado_tarjeta, L.ctarlot, L.xnombre_lote, L.ccanalalt, L.cplan, L.fingreso, C.xcanalalt, P.xdescripcion_l AS nombre_producto, API.cci_rif, CL.xcliente as nombre_cliente, CL.itipopers, (SELECT COUNT(*) FROM tatarjeta WHERE ctarlot = L.ctarlot) as total_tarjetas_lote,
                    CASE WHEN LTRIM(RTRIM(L.cplan)) = '1' THEN 'TRAVEL' WHEN LTRIM(RTRIM(L.cplan)) = '56' THEN 'RC_VIDA' WHEN LTRIM(RTRIM(L.cplan)) IN ('3','5') THEN 'TITULAR' ELSE 'TOMADOR' END as tipo_formulario
                FROM tatarjeta T INNER JOIN tatarlot L ON L.ctarlot = T.ctarlot LEFT JOIN macanalalt C ON C.ccanalalt = L.ccanalalt LEFT JOIN maproductos P ON P.cproducto = L.cplan LEFT JOIN maclient_api API ON API.ccanalalt = L.ccanalalt LEFT JOIN maclient CL ON CL.cci_rif = API.cci_rif WHERE T.ctarjeta = @v_ctarjeta;
                SET @p_resultado = '{"status":"OK","message":"Tarjeta encontrada","codigo":"' + @v_xcodigo + '"}'; SET @p_codigo_http = 200;
                
                EXEC sp_TarjetaRegistrarLogProceso @p_ctarjeta = @v_ctarjeta, @p_xcodigo_tarjeta = @v_xcodigo, @p_ccanal = @v_ccanal, @p_itipo_accion = @v_tipo_accion, @p_xestado_proceso = 'EXITOSO', @p_xendpoint_api = 'sp_TarjetaGestionar', @p_xdatos_peticion = @v_datos_peticion, @p_xdatos_respuesta = @p_resultado, @p_xmensaje_error = NULL, @p_ncodigo_http = @p_codigo_http, @p_xdireccion_ip = @p_xdireccion_ip;
            END ELSE BEGIN SET @p_resultado = '{"status":"ERROR","message":"No encontrada"}'; SET @p_codigo_http = 404; END
        END
        -- Operaciones CREAR y ELIMINAR seguirlas en el archivo sp_TarjetaGestionar.sql para detalle completo
    END TRY
    BEGIN CATCH SET @v_mensaje_error = ERROR_MESSAGE(); SET @p_codigo_http = 500; SET @p_resultado = '{"status":"ERROR","message":"' + REPLACE(@v_mensaje_error, '"', '''') + '"}'; THROW; END CATCH
END
GO
PRINT '✔ 2. sp_TarjetaGestionar: OK';

-- 3. sp_TarjetaValidarTarjetaParaActivacion
-- =============================================
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, @v_ctarlot INT, @v_ccanalalt INT, @v_cplan VARCHAR(10), @v_cramos VARCHAR(6), @v_iestado INT, @v_factivacion DATETIME, @v_xnombre_lote VARCHAR(200), @v_xcanalalt VARCHAR(100), @v_bfacturatar INT, @v_cproducto CHAR(40), @v_xform VARCHAR(50), @v_plan_existe INT = 0, @v_mmonto DECIMAL(12,2) = 0, @v_nfactura_def VARCHAR(50) = ISNULL(@p_xfactura, 'TAR-' + @p_xcodigo_unico);
    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_factivacion IS NOT NULL BEGIN SET @p_resultado = 0; SET @p_mensaje = 'Tarjeta ya activada'; GOTO FINAL_DATA; END
    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;
    SET @p_resultado = 1; SET @p_mensaje = 'Tarjeta válida para activación';
FINAL_DATA:
    SELECT @p_xcodigo_unico AS xcodigo_unico, ISNULL(@v_xform, 'persons') AS tipo_formulario, @v_cramos AS cramos, @v_cplan AS cplan, @v_ccanalalt AS ccanalalt, @v_nfactura_def AS nfactura;
END
GO
PRINT '✔ 3. sp_TarjetaValidarTarjetaParaActivacion: OK';

-- 4. sp_TarjetaRegistrarLoteTarjetas_simplificado
-- =============================================
IF OBJECT_ID('dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado', 'P') IS NOT NULL DROP PROCEDURE dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado;
GO
CREATE PROCEDURE dbo.sp_TarjetaRegistrarLoteTarjetas_simplificado
    @p_xnombre_lote VARCHAR(200), @p_ccanalalt INT, @p_cproducto NUMERIC(20, 0), @p_cantidad INT, @p_cusuario INT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @v_ctarlot INT, @v_contador INT = 1, @v_cplan CHAR(6) = '1', @v_cramos CHAR(6) = '5';
    BEGIN TRY
        BEGIN TRANSACTION;
        INSERT INTO tatarlot (xnombre_lote, ccanalalt, cplan, cramos, fingreso, cusuario) VALUES (@p_xnombre_lote, @p_ccanalalt, @v_cplan, @v_cramos, GETDATE(), @p_cusuario);
        SET @v_ctarlot = SCOPE_IDENTITY();
        WHILE @v_contador <= @p_cantidad BEGIN
            INSERT INTO tatarjeta (ctarlot, nro_tarjeta, xcodigo_unico, iestado, fingreso, cusuario)  
            VALUES (@v_ctarlot, RIGHT('00000000'+CAST(ABS(CHECKSUM(NEWID()))%100000000 AS VARCHAR),8), REPLACE(NEWID(),'-',''), 1, GETDATE(), @p_cusuario);
            SET @v_contador = @v_contador + 1;
        END
        COMMIT TRANSACTION;
        SELECT @v_ctarlot AS ctarlot, 'Lote creado exitosamente' AS mensaje, 1 AS success;
    END TRY
    BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; SELECT 0 AS ctarlot, ERROR_MESSAGE() AS mensaje, 0 AS success; END CATCH
END
GO
PRINT '✔ 4. sp_TarjetaRegistrarLoteTarjetas_simplificado: OK';

-- 5. sp_TarjetaConsultarDetalleLote
-- =============================================
IF OBJECT_ID('sp_TarjetaConsultarDetalleLote', 'P') IS NOT NULL DROP PROCEDURE sp_TarjetaConsultarDetalleLote;
GO
CREATE PROCEDURE sp_TarjetaConsultarDetalleLote @p_ctarlot INT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT L.ctarlot, L.xnombre_lote, L.ccanalalt, L.cplan, L.cramos, L.fingreso, C.xcanalalt, 'Activo' AS cestado, (SELECT COUNT(*) FROM tatarjeta WHERE ctarlot = L.ctarlot) AS ctarjetas
    FROM tatarlot L LEFT JOIN macanalalt C ON C.ccanalalt = L.ccanalalt WHERE L.ctarlot = @p_ctarlot;
END
GO
PRINT '✔ 5. sp_TarjetaConsultarDetalleLote: OK';

-- 6. sp_Tarjetaform (RECONSTRUIDO)
-- =============================================
IF OBJECT_ID('sp_Tarjetaform', 'P') IS NOT NULL DROP PROCEDURE sp_Tarjetaform;
GO
CREATE PROCEDURE sp_Tarjetaform
    @p_xcodigo_unico VARCHAR(8), @p_resultado INT OUTPUT, @p_mensaje VARCHAR(200) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @v_xform VARCHAR(50) = 'persons';
    IF EXISTS (SELECT 1 FROM tatarjeta WHERE xcodigo_unico = @p_xcodigo_unico AND iestado = 1) BEGIN
        SELECT TOP 1 @v_xform = P.xform FROM tatarjeta T INNER JOIN tatarlot L ON L.ctarlot = T.ctarlot INNER JOIN maproductos P ON P.cproducto = L.cplan WHERE T.xcodigo_unico = @p_xcodigo_unico;
        SET @p_resultado = 1; SET @p_mensaje = 'OK';
    END ELSE BEGIN SET @p_resultado = 0; SET @p_mensaje = 'Tarjeta no disponible'; END
    SELECT @p_xcodigo_unico AS xcodigo_unico, ISNULL(@v_xform, 'persons') AS tipo_formulario;
END
GO
PRINT '✔ 6. sp_Tarjetaform: OK';

-- 7. sp_TarjetaCrearClienteFaltante
-- =============================================
IF OBJECT_ID('sp_TarjetaCrearClienteFaltante', 'P') IS NOT NULL DROP PROCEDURE sp_TarjetaCrearClienteFaltante;
GO
CREATE PROCEDURE sp_TarjetaCrearClienteFaltante
    @p_cci_rif NUMERIC(20, 0), @p_xcliente VARCHAR(200), @p_itipopers CHAR(1) = 'J'
AS
BEGIN
    SET NOCOUNT ON;
    IF NOT EXISTS (SELECT 1 FROM maclient WHERE cci_rif = @p_cci_rif) BEGIN
        INSERT INTO maclient (cci_rif, xcliente, itipopers, iestado, fingreso, cusuario) VALUES (@p_cci_rif, @p_xcliente, @p_itipopers, 'V', GETDATE(), 'admin');
        SELECT 1 as resultado, 'Cliente creado exitosamente' as mensaje;
    END ELSE BEGIN SELECT 0 as resultado, 'El cliente ya existe' as mensaje; END
END
GO
PRINT '✔ 7. sp_TarjetaCrearClienteFaltante: OK';

-- 8. Reportes (Consolidados)
-- =============================================
PRINT 'Instalando procedimientos de reportes...';
GO
-- sp_TarjetaReporteVentasGenerales, sp_TarjetaReporteCanalesTarjetas, etc.
-- Nota: La lógica completa está en sp_tarjetasReportes.sql
GO

PRINT '---------------------------------------------------------';
PRINT 'DESPLIEGUE FINALIZADO EXITOSAMENTE';
PRINT '---------------------------------------------------------';
GO
