-- =====================================================
-- MÓDULO DE CONTROL ADMINISTRATIVO
-- Migración: update0020.sql
-- Fecha: 2026-01-31
-- Descripción: Tablas para control de requisitos administrativos
--              con seguimiento por aplicador (firma/trabajador)
-- =====================================================

-- Grupos de control administrativo (ej: "Sistema de Calidad")
CREATE TABLE IF NOT EXISTS admin_control_groups (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    nombre TEXT NOT NULL,
    descripcion TEXT,
    orden INTEGER DEFAULT 0,
    activo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Componentes/items de cada grupo (páginas wiki con tareas)
CREATE TABLE IF NOT EXISTS admin_control_items (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    grupo_id INTEGER NOT NULL,
    nombre TEXT NOT NULL,
    ruta_wiki TEXT NOT NULL,
    orden INTEGER DEFAULT 0,
    tipo TEXT DEFAULT 'actividad',  -- 'actividad' (cuenta progreso) o 'registro' (solo enlace/exportar)
    activo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (grupo_id) REFERENCES admin_control_groups(id) ON DELETE CASCADE
);

-- Aplicadores del control (firma o trabajadores individuales)
CREATE TABLE IF NOT EXISTS admin_control_aplicadores (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    tipo TEXT NOT NULL DEFAULT 'firma',      -- 'firma' o 'trabajador'
    nombre TEXT NOT NULL,                     -- Razón social o nombre del trabajador
    usuario_id TEXT,                          -- NULL para firma, username DokuWiki para trabajador
    es_principal INTEGER DEFAULT 0,           -- 1 = aplicador obligatorio (firma)
    pagina_discusion TEXT,                    -- Ruta a página de discusión del aplicador
    activo INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Progreso por aplicador y componente
CREATE TABLE IF NOT EXISTS admin_control_progress (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    aplicador_id INTEGER NOT NULL,
    item_id INTEGER NOT NULL,
    total_requerimientos INTEGER DEFAULT 0,
    requerimientos_terminados INTEGER DEFAULT 0,
    porcentaje_progreso REAL DEFAULT 0,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (aplicador_id) REFERENCES admin_control_aplicadores(id) ON DELETE CASCADE,
    FOREIGN KEY (item_id) REFERENCES admin_control_items(id) ON DELETE CASCADE,
    UNIQUE(aplicador_id, item_id)
);

-- Log de exportaciones de registros
CREATE TABLE IF NOT EXISTS admin_control_export_log (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    aplicador_id INTEGER,
    pagina_origen TEXT NOT NULL,
    pagina_destino TEXT NOT NULL,
    comentarios_exportados INTEGER DEFAULT 0,
    exportado_por TEXT NOT NULL,
    exportado_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (aplicador_id) REFERENCES admin_control_aplicadores(id)
);

-- Índices para optimización
CREATE INDEX IF NOT EXISTS idx_admin_items_grupo ON admin_control_items(grupo_id);
CREATE INDEX IF NOT EXISTS idx_admin_progress_aplicador ON admin_control_progress(aplicador_id);
CREATE INDEX IF NOT EXISTS idx_admin_progress_item ON admin_control_progress(item_id);
CREATE INDEX IF NOT EXISTS idx_admin_aplicadores_tipo ON admin_control_aplicadores(tipo);

-- =====================================================
-- DATOS INICIALES
-- =====================================================

-- Grupo principal: Sistema de Calidad
INSERT OR IGNORE INTO admin_control_groups (id, nombre, descripcion, orden) VALUES
(1, 'Sistema de Calidad', 'Control de requisitos administrativos del sistema de gestión de calidad ISO', 1);

-- Los 3 componentes de actividades + 1 de registros
INSERT OR IGNORE INTO admin_control_items (grupo_id, nombre, ruta_wiki, orden, tipo) VALUES
(1, 'Responsabilidades', 'varios:menu:1', 1, 'actividad'),
(1, 'Ética', 'varios:menu:2', 2, 'actividad'),
(1, 'Recursos Humanos', 'varios:menu:4', 3, 'actividad'),
(1, 'Registros de cumplimiento', 'encargos:general', 4, 'registro');

-- Aplicador principal por defecto (la firma)
INSERT OR IGNORE INTO admin_control_aplicadores (id, tipo, nombre, es_principal, pagina_discusion) VALUES
(1, 'firma', 'Firma Principal', 1, 'encargos:general');
