-- ============================================================
-- Club Palestino CRM v2.0 — MÓDULO SEGURIDAD Y PRIVACIDAD
-- Fase 11 — Ley 19.628 + Ley 21.719 + ISO 27001
-- ============================================================

-- ── 1. REGISTRO DE TRATAMIENTO DE DATOS (Ley 21.719) ─────────
CREATE TABLE IF NOT EXISTS `privacidad_registro_tratamiento` (
    `id`            INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `empresa_id`    TINYINT UNSIGNED NOT NULL DEFAULT 1,
    `nombre`        VARCHAR(200)     NOT NULL COMMENT 'Ej: Gestión de membresías',
    `finalidad`     TEXT             NOT NULL COMMENT 'Para qué se usan los datos',
    `base_legal`    ENUM(
        'consentimiento',
        'ejecucion_contrato',
        'obligacion_legal',
        'interes_legitimo',
        'interes_vital'
    ) NOT NULL DEFAULT 'ejecucion_contrato',
    `categorias_datos` TEXT          NOT NULL COMMENT 'Qué tipos de datos se tratan',
    `categorias_titulares` VARCHAR(200) NOT NULL COMMENT 'Socios, empleados, visitantes',
    `destinatarios` TEXT             NULL COMMENT 'A quiénes se comunican: SII, AFP, etc.',
    `transferencia_internacional` TINYINT(1) NOT NULL DEFAULT 0,
    `pais_destino`  VARCHAR(60)      NULL,
    `plazo_conservacion` VARCHAR(100) NOT NULL COMMENT 'Cuánto tiempo se conservan',
    `medidas_seguridad` TEXT         NULL,
    `responsable`   VARCHAR(150)     NOT NULL COMMENT 'Nombre del responsable del tratamiento',
    `activo`        TINYINT(1)       NOT NULL DEFAULT 1,
    `created_at`    TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Registros de tratamiento base
INSERT INTO `privacidad_registro_tratamiento`
    (`empresa_id`,`nombre`,`finalidad`,`base_legal`,`categorias_datos`,`categorias_titulares`,`destinatarios`,`plazo_conservacion`,`responsable`) VALUES
(1,'Gestión de membresías','Administrar la membresía anual del socio, cobros y acceso al club','ejecucion_contrato','Nombre, RUT, fecha nacimiento, dirección, teléfono, email, datos bancarios, historial de pagos','Socios activos y sus grupos familiares','SII (para emisión de DTE), procesadores de pago WebPay/Khipu','Durante la vigencia de la membresía + 6 años (obligación tributaria)','Club Palestino — Gerencia General'),
(1,'Control de acceso físico','Registrar entradas y salidas al club para seguridad y control de aforo','ejecucion_contrato','Datos biométricos faciales (ZKTeco), patentes vehiculares, timestamp de accesos','Socios, invitados y empleados','Sin transferencias a terceros','2 años para logs de acceso, datos biométricos solo mientras sea socio activo','Club Palestino — Seguridad'),
(1,'Comunicaciones y marketing','Enviar comunicados del club, noticias y eventos por WhatsApp y email','consentimiento','Número de teléfono, email, nombre','Socios con consentimiento activo','WATI (proveedor WhatsApp certificado Meta)','Hasta revocación del consentimiento','Club Palestino — Secretaría General'),
(1,'Gestión de empleados','Administrar contratos, remuneraciones, previsión y finiquitos','obligacion_legal','RUT, nombre, fecha nacimiento, dirección, datos bancarios, datos de salud, AFP, licencias','Empleados activos e inactivos','AFP, Isapre/Fonasa, Previred, Mutual de Seguridad, SII (F29)','5 años desde término contrato (Código del Trabajo)','Club Palestino — Recursos Humanos');

-- ── 2. CONSENTIMIENTOS ────────────────────────────────────────
CREATE TABLE IF NOT EXISTS `privacidad_consentimientos` (
    `id`          BIGINT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `socio_id`    INT UNSIGNED     NOT NULL,
    `tipo`        ENUM(
        'tratamiento_general',
        'marketing_whatsapp',
        'marketing_email',
        'datos_biometricos',
        'transferencia_terceros',
        'cookies'
    ) NOT NULL,
    `otorgado`    TINYINT(1)       NOT NULL DEFAULT 1,
    `fecha`       TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `ip`          VARCHAR(45)      NULL,
    `canal`       ENUM('web','app','presencial','telefono') NOT NULL DEFAULT 'web',
    `version_politica` VARCHAR(20) NOT NULL DEFAULT '1.0',
    `revocado_at` TIMESTAMP        NULL,
    `revocado_canal` VARCHAR(50)   NULL,
    PRIMARY KEY (`id`),
    KEY `idx_socio_consent` (`socio_id`,`tipo`),
    KEY `idx_tipo_vigente`  (`tipo`,`otorgado`,`revocado_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 3. SOLICITUDES DERECHOS ARCO (Art. 11 Ley 21.719) ────────
-- Acceso, Rectificación, Cancelación/Eliminación, Oposición + Portabilidad
CREATE TABLE IF NOT EXISTS `privacidad_solicitudes_arco` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `socio_id`    INT UNSIGNED     NULL,
    `nombre_solicitante` VARCHAR(150) NOT NULL,
    `rut`         VARCHAR(12)      NULL,
    `email`       VARCHAR(100)     NOT NULL,
    `telefono`    VARCHAR(20)      NULL,
    `tipo`        ENUM('acceso','rectificacion','eliminacion','oposicion','portabilidad','limitacion') NOT NULL,
    `descripcion` TEXT             NOT NULL,
    `estado`      ENUM('recibida','en_proceso','completada','rechazada') NOT NULL DEFAULT 'recibida',
    `respuesta`   TEXT             NULL,
    `fecha_limite` DATE             NOT NULL COMMENT '20 días hábiles según Ley 21.719',
    `fecha_respuesta' DATE         NULL,
    `usuario_asignado' INT UNSIGNED NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_estado_arco` (`estado`,`fecha_limite`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 4. LOG DE AUDITORÍA ───────────────────────────────────────
CREATE TABLE IF NOT EXISTS `auditoria_log` (
    `id`          BIGINT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `empresa_id`  TINYINT UNSIGNED NULL,
    `usuario_id`  INT UNSIGNED     NULL,
    `socio_id`    INT UNSIGNED     NULL,
    `accion`      VARCHAR(100)     NOT NULL COMMENT 'Ej: LOGIN, UPDATE_SOCIO, DELETE_DATA',
    `modulo`      VARCHAR(50)      NOT NULL COMMENT 'socios, contabilidad, rrhh, etc.',
    `tabla`       VARCHAR(80)      NULL,
    `registro_id` INT UNSIGNED     NULL,
    `datos_antes` JSON             NULL COMMENT 'Estado antes del cambio (UPDATE/DELETE)',
    `datos_despues' JSON           NULL COMMENT 'Estado después del cambio',
    `ip`          VARCHAR(45)      NULL,
    `user_agent`  VARCHAR(300)     NULL,
    `resultado`   ENUM('ok','error','denegado') NOT NULL DEFAULT 'ok',
    `detalle`     VARCHAR(300)     NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_usuario_log`  (`usuario_id`,`created_at`),
    KEY `idx_modulo_log`   (`modulo`,`accion`,`created_at`),
    KEY `idx_socio_log`    (`socio_id`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Log inmutable de todas las operaciones críticas del sistema'
  ROW_FORMAT=COMPRESSED;

-- ── 5. INCIDENTES DE SEGURIDAD (Brechas — Ley 21.719 Art.49) ─
CREATE TABLE IF NOT EXISTS `seguridad_incidentes` (
    `id`          INT UNSIGNED     NOT NULL AUTO_INCREMENT,
    `tipo`        ENUM('brecha_datos','acceso_no_autorizado','malware','phishing','perdida_dispositivo','otro') NOT NULL,
    `descripcion` TEXT             NOT NULL,
    `datos_afectados` TEXT         NULL COMMENT 'Qué tipos de datos se vieron afectados',
    `personas_afectadas` INT UNSIGNED NULL COMMENT 'Número estimado de titulares afectados',
    `fecha_deteccion' DATETIME     NOT NULL,
    `fecha_ocurrencia' DATETIME    NULL,
    `es_brecha_notificable` TINYINT(1) NOT NULL DEFAULT 0 COMMENT 'Debe notificarse a CPLT en 72h',
    `notificado_cplt' TINYINT(1)   NOT NULL DEFAULT 0 COMMENT 'Notificado al Consejo para la Transparencia',
    `fecha_notif_cplt' DATE        NULL,
    `notificado_titulares' TINYINT(1) NOT NULL DEFAULT 0,
    `fecha_notif_titulares' DATE   NULL,
    `medidas_tomadas' TEXT         NULL,
    `estado`      ENUM('detectado','investigando','contenido','cerrado') NOT NULL DEFAULT 'detectado',
    `responsable` VARCHAR(150)     NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 6. SESIONES DE USUARIO ────────────────────────────────────
CREATE TABLE IF NOT EXISTS `sesiones_usuarios` (
    `id`          VARCHAR(128)     NOT NULL COMMENT 'Session ID (hash seguro)',
    `usuario_id`  INT UNSIGNED     NOT NULL,
    `empresa_id`  TINYINT UNSIGNED NULL,
    `ip`          VARCHAR(45)      NOT NULL,
    `user_agent`  VARCHAR(300)     NULL,
    `2fa_verificado' TINYINT(1)    NOT NULL DEFAULT 0,
    `activo`      TINYINT(1)       NOT NULL DEFAULT 1,
    `ultimo_acceso' TIMESTAMP      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `expira_at`   TIMESTAMP        NOT NULL,
    `created_at`  TIMESTAMP        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_usuario_ses` (`usuario_id`,`activo`),
    KEY `idx_expira`      (`expira_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 7. INTENTOS DE LOGIN ──────────────────────────────────────
CREATE TABLE IF NOT EXISTS `login_intentos` (
    `id`          INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `identifier`  VARCHAR(100)  NOT NULL COMMENT 'RUT o email intentado',
    `ip`          VARCHAR(45)   NOT NULL,
    `exitoso`     TINYINT(1)    NOT NULL DEFAULT 0,
    `created_at`  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    KEY `idx_ip_intentos` (`ip`,`created_at`),
    KEY `idx_ident_intento` (`identifier`,`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ── 8. POLÍTICA DE PRIVACIDAD VERSIONES ──────────────────────
CREATE TABLE IF NOT EXISTS `privacidad_politicas` (
    `id`          INT UNSIGNED  NOT NULL AUTO_INCREMENT,
    `version`     VARCHAR(20)   NOT NULL,
    `titulo`      VARCHAR(200)  NOT NULL,
    `contenido`   LONGTEXT      NOT NULL,
    `fecha_vigencia' DATE       NOT NULL,
    `activa`      TINYINT(1)    NOT NULL DEFAULT 0,
    `created_at`  TIMESTAMP     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_version` (`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

