-- V006__create_rol_permiso.sql
-- Tabla M:N Rol ↔ Permiso + seed inicial según matriz §2.4.2.
-- Requiere: V003 (dbo.Rol), V005 (dbo.Permiso).
-- Convención RBAC: cada permiso nuevo → asignar explícitamente a admin en la misma migración.
-- 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.RolPermiso', N'U') IS NULL
BEGIN
    CREATE TABLE dbo.RolPermiso (
        Id              INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_RolPermiso PRIMARY KEY,
        RolId           INT               NOT NULL CONSTRAINT FK_RolPermiso_Rol     REFERENCES dbo.Rol(Id)     ON DELETE CASCADE,
        PermisoId       INT               NOT NULL CONSTRAINT FK_RolPermiso_Permiso REFERENCES dbo.Permiso(Id) ON DELETE CASCADE,
        FechaAsignacion DATETIME2(3)      NOT NULL CONSTRAINT DF_RolPermiso_FA DEFAULT(SYSUTCDATETIME()),
        CONSTRAINT UQ_RolPermiso UNIQUE (RolId, PermisoId)
    );
    CREATE INDEX IX_RolPermiso_RolId     ON dbo.RolPermiso (RolId);
    CREATE INDEX IX_RolPermiso_PermisoId ON dbo.RolPermiso (PermisoId);
    PRINT 'Table dbo.RolPermiso created.';
END
ELSE
    PRINT 'Table dbo.RolPermiso already exists — skip.';
GO

-- Seed: mapeo rol → permisos según matriz §2.4.2
-- admin:            18 permisos (explícito — sin wildcard, convención RBAC)
-- cajero:            4 permisos (ventas contado)
-- operador_ctacte:   2 permisos (ventas ctacte)
-- picadora:          2 permisos (textos)
-- jefe_publicidad:   7 permisos (textos + pauta + productores)
-- productor:         2 permisos (productores)
-- diagramacion:      1 permiso  (pauta:azanu:ver)
-- reportes:          0 permisos (solo lectura reportes — sin permisos en este catálogo)
-- Total rows: 36
MERGE dbo.RolPermiso AS t
USING (
    SELECT r.Id AS RolId, p.Id AS PermisoId
    FROM (VALUES
        -- admin (18 permisos)
        ('admin', 'ventas:contado:crear'),
        ('admin', 'ventas:contado:modificar'),
        ('admin', 'ventas:contado:cobrar'),
        ('admin', 'ventas:contado:facturar'),
        ('admin', 'ventas:ctacte:crear'),
        ('admin', 'ventas:ctacte:facturar'),
        ('admin', 'textos:editar'),
        ('admin', 'textos:reclamos:ver'),
        ('admin', 'pauta:azanu:ver'),
        ('admin', 'pauta:limpiar'),
        ('admin', 'pauta:recursos:fueradehora'),
        ('admin', 'productores:deuda:ver'),
        ('admin', 'productores:pendientes:crear'),
        ('admin', 'productores:deuda:bypass'),
        ('admin', 'administracion:usuarios:gestionar'),
        ('admin', 'administracion:tarifarios:gestionar'),
        ('admin', 'administracion:medios:gestionar'),
        ('admin', 'administracion:auditoria:ver'),
        -- cajero (4 permisos)
        ('cajero', 'ventas:contado:crear'),
        ('cajero', 'ventas:contado:modificar'),
        ('cajero', 'ventas:contado:cobrar'),
        ('cajero', 'ventas:contado:facturar'),
        -- operador_ctacte (2 permisos)
        ('operador_ctacte', 'ventas:ctacte:crear'),
        ('operador_ctacte', 'ventas:ctacte:facturar'),
        -- picadora (2 permisos)
        ('picadora', 'textos:editar'),
        ('picadora', 'textos:reclamos:ver'),
        -- jefe_publicidad (7 permisos)
        ('jefe_publicidad', 'textos:editar'),
        ('jefe_publicidad', 'textos:reclamos:ver'),
        ('jefe_publicidad', 'pauta:azanu:ver'),
        ('jefe_publicidad', 'pauta:limpiar'),
        ('jefe_publicidad', 'pauta:recursos:fueradehora'),
        ('jefe_publicidad', 'productores:deuda:ver'),
        ('jefe_publicidad', 'productores:deuda:bypass'),
        -- productor (2 permisos)
        ('productor', 'productores:deuda:ver'),
        ('productor', 'productores:pendientes:crear'),
        -- diagramacion (1 permiso)
        ('diagramacion', 'pauta:azanu:ver')
        -- reportes: 0 permisos — no filas
    ) AS x (RolCodigo, PermisoCodigo)
    JOIN dbo.Rol     r ON r.Codigo = x.RolCodigo
    JOIN dbo.Permiso p ON p.Codigo = x.PermisoCodigo
) AS s ON t.RolId = s.RolId AND t.PermisoId = s.PermisoId
WHEN NOT MATCHED BY TARGET THEN
    INSERT (RolId, PermisoId) VALUES (s.RolId, s.PermisoId);
GO

PRINT 'RolPermiso seeds applied (36 rows: admin×18 + cajero×4 + operador_ctacte×2 + picadora×2 + jefe_publicidad×7 + productor×2 + diagramacion×1).';
GO
