-- V005__create_permiso.sql
-- Tabla catálogo de permisos atómicos RBAC (18 permisos iniciales §2.4.2).
-- Requerimiento: ejecutar ANTES de V006 (FK PermisoId).
-- Run on: SIGCM2 (prod) and SIGCM2_Test (integration tests)

SET QUOTED_IDENTIFIER ON;
SET ANSI_NULLS ON;
SET NOCOUNT ON;
GO

IF OBJECT_ID(N'dbo.Permiso', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.Permiso (
        Id            INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_Permiso PRIMARY KEY,
        Codigo        VARCHAR(60)       NOT NULL,
        Nombre        NVARCHAR(100)     NOT NULL,
        Descripcion   NVARCHAR(500)     NULL,
        Modulo        VARCHAR(30)       NOT NULL,
        Activo        BIT               NOT NULL CONSTRAINT DF_Permiso_Activo DEFAULT(1),
        FechaCreacion DATETIME2(3)      NOT NULL CONSTRAINT DF_Permiso_FC DEFAULT(SYSUTCDATETIME()),
        CONSTRAINT UQ_Permiso_Codigo UNIQUE (Codigo),
        -- Formato: segmentos en minúsculas separados por ':', p.ej. ventas:contado:crear
        -- Usa collation binaria para forzar case-sensitivity (igual que CK_Rol_Codigo_Format).
        CONSTRAINT CK_Permiso_Codigo_Format CHECK (
            PATINDEX('[a-z]%', Codigo COLLATE Latin1_General_BIN2) = 1
            AND PATINDEX('%[^a-z0-9_:]%', Codigo COLLATE Latin1_General_BIN2) = 0
        )
    );
    PRINT 'Table dbo.Permiso created.';
END
ELSE
    PRINT 'Table dbo.Permiso already exists — skip.';
GO

-- Seed 18 permisos canónicos (idempotente via MERGE).
-- Convención RBAC: cada permiso nuevo → asignar a admin en la misma migración (V006+).
MERGE dbo.Permiso AS t
USING (VALUES
    ('ventas:contado:crear',                N'Cargar orden contado',                NULL,                                           'ventas'),
    ('ventas:contado:modificar',            N'Modificar orden contado',             NULL,                                           'ventas'),
    ('ventas:contado:cobrar',               N'Cobrar orden contado',                NULL,                                           'ventas'),
    ('ventas:contado:facturar',             N'Facturar orden contado',              NULL,                                           'ventas'),
    ('ventas:ctacte:crear',                 N'Cargar orden cuenta corriente',       NULL,                                           'ventas'),
    ('ventas:ctacte:facturar',              N'Facturar lote cuenta corriente',      NULL,                                           'ventas'),
    ('textos:editar',                       N'Editar textos',                       NULL,                                           'textos'),
    ('textos:reclamos:ver',                 N'Ver reclamos de textos',              NULL,                                           'textos'),
    ('pauta:azanu:ver',                     N'Ver AZANU en pauta',                  NULL,                                           'pauta'),
    ('pauta:limpiar',                       N'Limpieza de pauta',                   NULL,                                           'pauta'),
    ('pauta:recursos:fueradehora',          N'Recursos fuera de hora',              NULL,                                           'pauta'),
    ('productores:deuda:ver',               N'Ver deuda propia de productores',     NULL,                                           'productores'),
    ('productores:pendientes:crear',        N'Cargar pendientes de productores',    NULL,                                           'productores'),
    ('productores:deuda:bypass',            N'Bypass de deuda de productores',      NULL,                                           'productores'),
    ('administracion:usuarios:gestionar',   N'Gestionar usuarios del sistema',      N'Crear, editar y desactivar usuarios',         'administracion'),
    ('administracion:tarifarios:gestionar', N'Gestionar tarifarios',                N'Crear y modificar tarifarios de publicidad',  'administracion'),
    ('administracion:medios:gestionar',     N'Gestionar medios publicitarios',      N'Alta y configuración de medios',              'administracion'),
    ('administracion:auditoria:ver',        N'Ver logs de auditoría',               N'Acceso al dashboard de auditoría',            'administracion')
) AS s (Codigo, Nombre, Descripcion, Modulo)
ON t.Codigo = s.Codigo
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Codigo, Nombre, Descripcion, Modulo)
    VALUES (s.Codigo, s.Nombre, s.Descripcion, s.Modulo);
GO

PRINT 'Permiso seeds applied (18 permisos).';
GO
