CREATE DATABASE IF NOT EXISTS evaluaciones_saas
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE evaluaciones_saas;

SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS evaluacion_respuesta_opcion;
DROP TABLE IF EXISTS evaluacion_respuesta;
DROP TABLE IF EXISTS evaluacion_resultado;
DROP TABLE IF EXISTS evaluacion_asignacion;
DROP TABLE IF EXISTS evaluacion_participante;
DROP TABLE IF EXISTS evaluacion;
DROP TABLE IF EXISTS plantilla_opcion;
DROP TABLE IF EXISTS plantilla_pregunta;
DROP TABLE IF EXISTS plantilla_grupo;
DROP TABLE IF EXISTS plantilla;
DROP TABLE IF EXISTS plantilla_categoria;
DROP TABLE IF EXISTS participante;
DROP TABLE IF EXISTS empresa_usuario;
DROP TABLE IF EXISTS rol;
DROP TABLE IF EXISTS acceso;
DROP TABLE IF EXISTS settings_empresa;
DROP TABLE IF EXISTS usuario;
DROP TABLE IF EXISTS empresa;

SET FOREIGN_KEY_CHECKS = 1;

-- =========================================================
-- EMPRESA
-- =========================================================

CREATE TABLE empresa (
    emp_EmpresaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_Nombre VARCHAR(150) NOT NULL,
    emp_RazonSocial VARCHAR(200) NULL,
    emp_RFC VARCHAR(20) NULL,
    emp_Logo VARCHAR(255) NULL,
    emp_ColorPrincipal VARCHAR(20) NULL,
    emp_Subdominio VARCHAR(100) NULL,
    emp_Plan VARCHAR(50) NOT NULL DEFAULT 'basico',
    emp_MaxParticipantes INT UNSIGNED NULL,
    emp_MaxEvaluaciones INT UNSIGNED NULL,
    emp_Estatus TINYINT NOT NULL DEFAULT 1,
    emp_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    emp_CreadoPor INT UNSIGNED NULL,
    emp_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    emp_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (emp_EmpresaID),
    UNIQUE KEY uq_empresa_subdominio (emp_Subdominio),
    KEY idx_empresa_estatus (emp_Estatus)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- USUARIO
-- Usuarios del sistema.
-- Un usuario puede ser super administrador o usuario de empresa.
-- =========================================================

CREATE TABLE usuario (
    usu_UsuarioID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    usu_Nombre VARCHAR(150) NOT NULL,
    usu_Correo VARCHAR(150) NOT NULL,
    usu_Password VARCHAR(255) NOT NULL,
    usu_Telefono VARCHAR(30) NULL,
    usu_EsSuperAdmin TINYINT NOT NULL DEFAULT 0,
    usu_UltimoAcceso DATETIME NULL,
    usu_Estatus TINYINT NOT NULL DEFAULT 1,
    usu_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    usu_CreadoPor INT UNSIGNED NULL,
    usu_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    usu_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (usu_UsuarioID),
    UNIQUE KEY uq_usuario_correo (usu_Correo),
    KEY idx_usuario_superadmin (usu_EsSuperAdmin),
    KEY idx_usuario_estatus (usu_Estatus)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- ROL
-- emp_EmpresaID NULL = rol global del sistema.
-- emp_EmpresaID con valor = rol propio de una empresa.
-- =========================================================

CREATE TABLE rol (
    rol_RolID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NULL,
    rol_Nombre VARCHAR(100) NOT NULL,
    rol_Descripcion TEXT NULL,
    rol_Permisos LONGTEXT NULL COMMENT 'JSON con permisos del rol',
    rol_EsSistema TINYINT NOT NULL DEFAULT 0,
    rol_Estatus TINYINT NOT NULL DEFAULT 1,
    rol_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    rol_CreadoPor INT UNSIGNED NULL,
    rol_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    rol_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (rol_RolID),
    KEY idx_rol_empresa (emp_EmpresaID),
    KEY idx_rol_estatus (rol_Estatus),
    CONSTRAINT fk_rol_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- EMPRESA USUARIO
-- Relación entre usuario y empresa.
-- Tu usuario super admin puede existir sin estar ligado aquí.
-- =========================================================

CREATE TABLE empresa_usuario (
    empusu_EmpresaUsuarioID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NOT NULL,
    usu_UsuarioID INT UNSIGNED NOT NULL,
    rol_RolID INT UNSIGNED NOT NULL,
    empusu_Estatus TINYINT NOT NULL DEFAULT 1,
    empusu_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    empusu_CreadoPor INT UNSIGNED NULL,
    empusu_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    empusu_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (empusu_EmpresaUsuarioID),
    UNIQUE KEY uq_empresa_usuario (emp_EmpresaID, usu_UsuarioID),
    KEY idx_empusu_empresa (emp_EmpresaID),
    KEY idx_empusu_usuario (usu_UsuarioID),
    KEY idx_empusu_rol (rol_RolID),
    CONSTRAINT fk_empusu_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_empusu_usuario
        FOREIGN KEY (usu_UsuarioID)
        REFERENCES usuario(usu_UsuarioID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_empusu_rol
        FOREIGN KEY (rol_RolID)
        REFERENCES rol(rol_RolID)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- PARTICIPANTE
-- Colaborador simplificado.
-- Aquí no guardamos salario, horarios ni datos sensibles innecesarios.
-- =========================================================

CREATE TABLE participante (
    par_ParticipanteID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NOT NULL,
    usu_UsuarioID INT UNSIGNED NULL,
    par_Numero VARCHAR(50) NULL,
    par_Nombre VARCHAR(150) NOT NULL,
    par_Correo VARCHAR(150) NULL,
    par_Puesto VARCHAR(150) NULL,
    par_Area VARCHAR(150) NULL,
    par_Departamento VARCHAR(150) NULL,
    par_Sucursal VARCHAR(150) NULL,
    par_JefeNombre VARCHAR(150) NULL,
    par_JefeCorreo VARCHAR(150) NULL,
    par_FechaIngreso DATE NULL,
    par_Estatus TINYINT NOT NULL DEFAULT 1,
    par_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    par_CreadoPor INT UNSIGNED NULL,
    par_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    par_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (par_ParticipanteID),
    KEY idx_participante_empresa (emp_EmpresaID),
    KEY idx_participante_usuario (usu_UsuarioID),
    KEY idx_participante_correo (emp_EmpresaID, par_Correo),
    KEY idx_participante_estatus (par_Estatus),
    CONSTRAINT fk_participante_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_participante_usuario
        FOREIGN KEY (usu_UsuarioID)
        REFERENCES usuario(usu_UsuarioID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- CATEGORÍA DE PLANTILLA
-- Ejemplo: NOM-035, clima laboral, desempeño, capacitación.
-- emp_EmpresaID NULL = categoría global.
-- =========================================================

CREATE TABLE plantilla_categoria (
    cat_CategoriaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NULL,
    cat_Nombre VARCHAR(150) NOT NULL,
    cat_Descripcion TEXT NULL,
    cat_EsGlobal TINYINT NOT NULL DEFAULT 0,
    cat_Estatus TINYINT NOT NULL DEFAULT 1,
    cat_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    cat_CreadoPor INT UNSIGNED NULL,
    PRIMARY KEY (cat_CategoriaID),
    KEY idx_categoria_empresa (emp_EmpresaID),
    KEY idx_categoria_estatus (cat_Estatus),
    CONSTRAINT fk_categoria_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- PLANTILLA
-- Cuestionario base.
-- Puede ser global o de una empresa.
-- =========================================================

CREATE TABLE plantilla (
    pla_PlantillaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NULL,
    cat_CategoriaID INT UNSIGNED NULL,
    pla_Nombre VARCHAR(150) NOT NULL,
    pla_Tipo ENUM(
        'desempeno',
        'clima_laboral',
        'nom035',
        'capacitacion',
        'onboarding',
        'personalizada'
    ) NOT NULL DEFAULT 'personalizada',
    pla_Descripcion TEXT NULL,
    pla_CalificacionEsperada DECIMAL(10,2) NOT NULL DEFAULT 0,
    pla_EsGlobal TINYINT NOT NULL DEFAULT 0,
    pla_PermiteAnonima TINYINT NOT NULL DEFAULT 0,
    pla_Estatus TINYINT NOT NULL DEFAULT 1,
    pla_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    pla_CreadoPor INT UNSIGNED NULL,
    pla_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    pla_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (pla_PlantillaID),
    KEY idx_plantilla_empresa (emp_EmpresaID),
    KEY idx_plantilla_categoria (cat_CategoriaID),
    KEY idx_plantilla_tipo (pla_Tipo),
    KEY idx_plantilla_estatus (pla_Estatus),
    CONSTRAINT fk_plantilla_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_plantilla_categoria
        FOREIGN KEY (cat_CategoriaID)
        REFERENCES plantilla_categoria(cat_CategoriaID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- GRUPOS DE LA PLANTILLA
-- Ejemplo: Liderazgo, Comunicación, Competencias, Factores de riesgo.
-- =========================================================

CREATE TABLE plantilla_grupo (
    pgru_GrupoID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    pla_PlantillaID INT UNSIGNED NOT NULL,
    pgru_Nombre VARCHAR(150) NOT NULL,
    pgru_Descripcion TEXT NULL,
    pgru_Orden INT NOT NULL DEFAULT 1,
    pgru_Ponderacion DECIMAL(10,2) NOT NULL DEFAULT 0,
    pgru_Estatus TINYINT NOT NULL DEFAULT 1,
    PRIMARY KEY (pgru_GrupoID),
    KEY idx_pgrupo_plantilla (pla_PlantillaID),
    KEY idx_pgrupo_orden (pla_PlantillaID, pgru_Orden),
    CONSTRAINT fk_pgrupo_plantilla
        FOREIGN KEY (pla_PlantillaID)
        REFERENCES plantilla(pla_PlantillaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- PREGUNTAS DE LA PLANTILLA
-- =========================================================

CREATE TABLE plantilla_pregunta (
    pre_PreguntaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    pla_PlantillaID INT UNSIGNED NOT NULL,
    pgru_GrupoID INT UNSIGNED NULL,
    pre_Texto TEXT NOT NULL,
    pre_Ayuda TEXT NULL,
    pre_Tipo ENUM(
        'rango',
        'opcion_unica',
        'opcion_multiple',
        'texto',
        'numero',
        'si_no'
    ) NOT NULL DEFAULT 'rango',
    pre_Obligatoria TINYINT NOT NULL DEFAULT 1,
    pre_Ponderacion DECIMAL(10,2) NOT NULL DEFAULT 0,
    pre_Orden INT NOT NULL DEFAULT 1,
    pre_Estatus TINYINT NOT NULL DEFAULT 1,
    PRIMARY KEY (pre_PreguntaID),
    KEY idx_pregunta_plantilla (pla_PlantillaID),
    KEY idx_pregunta_grupo (pgru_GrupoID),
    KEY idx_pregunta_orden (pla_PlantillaID, pgru_GrupoID, pre_Orden),
    CONSTRAINT fk_pregunta_plantilla
        FOREIGN KEY (pla_PlantillaID)
        REFERENCES plantilla(pla_PlantillaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_pregunta_grupo
        FOREIGN KEY (pgru_GrupoID)
        REFERENCES plantilla_grupo(pgru_GrupoID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- OPCIONES DE RESPUESTA
-- Para preguntas de rango, opción única, opción múltiple o sí/no.
-- =========================================================

CREATE TABLE plantilla_opcion (
    opc_OpcionID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    pre_PreguntaID INT UNSIGNED NOT NULL,
    opc_Texto VARCHAR(255) NOT NULL,
    opc_Valor DECIMAL(10,2) NOT NULL DEFAULT 0,
    opc_Orden INT NOT NULL DEFAULT 1,
    opc_Estatus TINYINT NOT NULL DEFAULT 1,
    PRIMARY KEY (opc_OpcionID),
    KEY idx_opcion_pregunta (pre_PreguntaID),
    KEY idx_opcion_orden (pre_PreguntaID, opc_Orden),
    CONSTRAINT fk_opcion_pregunta
        FOREIGN KEY (pre_PreguntaID)
        REFERENCES plantilla_pregunta(pre_PreguntaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- EVALUACIÓN
-- Periodo/campaña de evaluación.
-- =========================================================

CREATE TABLE evaluacion (
    eva_EvaluacionID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NOT NULL,
    pla_PlantillaID INT UNSIGNED NOT NULL,
    eva_Nombre VARCHAR(150) NOT NULL,
    eva_Tipo ENUM(
        'desempeno',
        'clima_laboral',
        'nom035',
        'capacitacion',
        'onboarding',
        'personalizada'
    ) NOT NULL DEFAULT 'personalizada',
    eva_Descripcion TEXT NULL,
    eva_FechaInicio DATE NOT NULL,
    eva_FechaFin DATE NOT NULL,
    eva_Anonima TINYINT NOT NULL DEFAULT 0,
    eva_MostrarResultados TINYINT NOT NULL DEFAULT 0,
    eva_PlantillaSnapshot LONGTEXT NULL COMMENT 'JSON opcional para conservar estructura histórica de la plantilla',
    eva_Estatus ENUM(
        'borrador',
        'activa',
        'cerrada',
        'cancelada'
    ) NOT NULL DEFAULT 'borrador',
    eva_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    eva_CreadoPor INT UNSIGNED NULL,
    eva_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    eva_ModificadoPor INT UNSIGNED NULL,
    PRIMARY KEY (eva_EvaluacionID),
    KEY idx_evaluacion_empresa (emp_EmpresaID),
    KEY idx_evaluacion_plantilla (pla_PlantillaID),
    KEY idx_evaluacion_estatus (eva_Estatus),
    KEY idx_evaluacion_fechas (eva_FechaInicio, eva_FechaFin),
    CONSTRAINT fk_evaluacion_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_evaluacion_plantilla
        FOREIGN KEY (pla_PlantillaID)
        REFERENCES plantilla(pla_PlantillaID)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- PARTICIPANTES DE LA EVALUACIÓN
-- Personas que serán evaluadas dentro de una evaluación.
-- =========================================================

CREATE TABLE evaluacion_participante (
    evapar_EvaluacionParticipanteID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    eva_EvaluacionID INT UNSIGNED NOT NULL,
    par_ParticipanteID INT UNSIGNED NOT NULL,
    evapar_Estatus ENUM(
        'pendiente',
        'en_proceso',
        'completado',
        'cancelado'
    ) NOT NULL DEFAULT 'pendiente',
    evapar_Resultado DECIMAL(10,2) NULL,
    evapar_FechaCompletado DATETIME NULL,
    evapar_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (evapar_EvaluacionParticipanteID),
    UNIQUE KEY uq_evaluacion_participante (eva_EvaluacionID, par_ParticipanteID),
    KEY idx_evapar_evaluacion (eva_EvaluacionID),
    KEY idx_evapar_participante (par_ParticipanteID),
    KEY idx_evapar_estatus (evapar_Estatus),
    CONSTRAINT fk_evapar_evaluacion
        FOREIGN KEY (eva_EvaluacionID)
        REFERENCES evaluacion(eva_EvaluacionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_evapar_participante
        FOREIGN KEY (par_ParticipanteID)
        REFERENCES participante(par_ParticipanteID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- ASIGNACIÓN DE EVALUADORES
-- Aquí defines quién evalúa a quién.
-- Permite autoevaluación, jefe, pares, subordinados, externo o anónimo.
-- =========================================================

CREATE TABLE evaluacion_asignacion (
    asi_AsignacionID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    eva_EvaluacionID INT UNSIGNED NOT NULL,
    par_EvaluadoID INT UNSIGNED NOT NULL,
    par_EvaluadorID INT UNSIGNED NULL,
    usu_EvaluadorID INT UNSIGNED NULL,
    asi_Tipo ENUM(
        'auto',
        'jefe',
        'par',
        'subordinado',
        'externo',
        'anonimo'
    ) NOT NULL DEFAULT 'jefe',
    asi_NombreExterno VARCHAR(150) NULL,
    asi_CorreoExterno VARCHAR(150) NULL,
    asi_Token VARCHAR(150) NULL,
    asi_Estatus ENUM(
        'pendiente',
        'en_proceso',
        'completado',
        'cancelado'
    ) NOT NULL DEFAULT 'pendiente',
    asi_FechaEnvio DATETIME NULL,
    asi_FechaInicio DATETIME NULL,
    asi_FechaCompletado DATETIME NULL,
    asi_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    asi_CreadoPor INT UNSIGNED NULL,
    PRIMARY KEY (asi_AsignacionID),
    UNIQUE KEY uq_asignacion_token (asi_Token),
    KEY idx_asignacion_evaluacion (eva_EvaluacionID),
    KEY idx_asignacion_evaluado (par_EvaluadoID),
    KEY idx_asignacion_evaluador_participante (par_EvaluadorID),
    KEY idx_asignacion_evaluador_usuario (usu_EvaluadorID),
    KEY idx_asignacion_estatus (asi_Estatus),
    CONSTRAINT fk_asignacion_evaluacion
        FOREIGN KEY (eva_EvaluacionID)
        REFERENCES evaluacion(eva_EvaluacionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_asignacion_evaluado
        FOREIGN KEY (par_EvaluadoID)
        REFERENCES participante(par_ParticipanteID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_asignacion_evaluador_participante
        FOREIGN KEY (par_EvaluadorID)
        REFERENCES participante(par_ParticipanteID)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    CONSTRAINT fk_asignacion_evaluador_usuario
        FOREIGN KEY (usu_EvaluadorID)
        REFERENCES usuario(usu_UsuarioID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- RESPUESTAS
-- Una respuesta por pregunta y por asignación.
-- Esto facilita reportes, promedios y gráficas.
-- =========================================================

CREATE TABLE evaluacion_respuesta (
    res_RespuestaID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    asi_AsignacionID INT UNSIGNED NOT NULL,
    eva_EvaluacionID INT UNSIGNED NOT NULL,
    pre_PreguntaID INT UNSIGNED NOT NULL,
    opc_OpcionID INT UNSIGNED NULL,
    res_Valor DECIMAL(10,2) NULL,
    res_Texto TEXT NULL,
    res_Fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (res_RespuestaID),
    UNIQUE KEY uq_respuesta_pregunta (asi_AsignacionID, pre_PreguntaID),
    KEY idx_respuesta_asignacion (asi_AsignacionID),
    KEY idx_respuesta_evaluacion (eva_EvaluacionID),
    KEY idx_respuesta_pregunta (pre_PreguntaID),
    KEY idx_respuesta_opcion (opc_OpcionID),
    CONSTRAINT fk_respuesta_asignacion
        FOREIGN KEY (asi_AsignacionID)
        REFERENCES evaluacion_asignacion(asi_AsignacionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_respuesta_evaluacion
        FOREIGN KEY (eva_EvaluacionID)
        REFERENCES evaluacion(eva_EvaluacionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_respuesta_pregunta
        FOREIGN KEY (pre_PreguntaID)
        REFERENCES plantilla_pregunta(pre_PreguntaID)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT fk_respuesta_opcion
        FOREIGN KEY (opc_OpcionID)
        REFERENCES plantilla_opcion(opc_OpcionID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- RESPUESTA OPCIÓN
-- Para preguntas de opción múltiple.
-- =========================================================

CREATE TABLE evaluacion_respuesta_opcion (
    resopc_RespuestaOpcionID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    res_RespuestaID INT UNSIGNED NOT NULL,
    opc_OpcionID INT UNSIGNED NOT NULL,
    resopc_Valor DECIMAL(10,2) NULL,
    PRIMARY KEY (resopc_RespuestaOpcionID),
    UNIQUE KEY uq_respuesta_opcion (res_RespuestaID, opc_OpcionID),
    KEY idx_resopc_respuesta (res_RespuestaID),
    KEY idx_resopc_opcion (opc_OpcionID),
    CONSTRAINT fk_resopc_respuesta
        FOREIGN KEY (res_RespuestaID)
        REFERENCES evaluacion_respuesta(res_RespuestaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_resopc_opcion
        FOREIGN KEY (opc_OpcionID)
        REFERENCES plantilla_opcion(opc_OpcionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- RESULTADOS
-- Tabla opcional para guardar resultados precalculados.
-- Útil para dashboards, reportes y PDF.
-- =========================================================

CREATE TABLE evaluacion_resultado (
    resul_ResultadoID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    eva_EvaluacionID INT UNSIGNED NOT NULL,
    par_ParticipanteID INT UNSIGNED NULL,
    pgru_GrupoID INT UNSIGNED NULL,
    resul_Tipo VARCHAR(50) NULL,
    resul_Promedio DECIMAL(10,2) NOT NULL DEFAULT 0,
    resul_Total DECIMAL(10,2) NOT NULL DEFAULT 0,
    resul_Nivel VARCHAR(100) NULL,
    resul_Interpretacion TEXT NULL,
    resul_Datos LONGTEXT NULL COMMENT 'JSON opcional con datos adicionales',
    resul_Fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (resul_ResultadoID),
    KEY idx_resultado_evaluacion (eva_EvaluacionID),
    KEY idx_resultado_participante (par_ParticipanteID),
    KEY idx_resultado_grupo (pgru_GrupoID),
    KEY idx_resultado_tipo (resul_Tipo),
    CONSTRAINT fk_resultado_evaluacion
        FOREIGN KEY (eva_EvaluacionID)
        REFERENCES evaluacion(eva_EvaluacionID)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT fk_resultado_participante
        FOREIGN KEY (par_ParticipanteID)
        REFERENCES participante(par_ParticipanteID)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    CONSTRAINT fk_resultado_grupo
        FOREIGN KEY (pgru_GrupoID)
        REFERENCES plantilla_grupo(pgru_GrupoID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- SETTINGS POR EMPRESA
-- Configuración flexible por cliente.
-- =========================================================

CREATE TABLE settings_empresa (
    set_SettingID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NOT NULL,
    set_Key VARCHAR(100) NOT NULL,
    set_Value LONGTEXT NULL,
    set_Descripcion VARCHAR(255) NULL,
    set_CreadoFecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    set_ModificadoFecha DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (set_SettingID),
    UNIQUE KEY uq_empresa_setting (emp_EmpresaID, set_Key),
    KEY idx_setting_empresa (emp_EmpresaID),
    CONSTRAINT fk_setting_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- ACCESOS / BITÁCORA LOGIN
-- =========================================================

CREATE TABLE acceso (
    acc_AccesoID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    emp_EmpresaID INT UNSIGNED NULL,
    usu_UsuarioID INT UNSIGNED NULL,
    acc_Tipo VARCHAR(50) NOT NULL,
    acc_IP VARCHAR(45) NULL,
    acc_UserAgent TEXT NULL,
    acc_Fecha DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    acc_Estatus TINYINT NOT NULL DEFAULT 1,
    acc_Plataforma ENUM('web','app') NOT NULL DEFAULT 'web',
    PRIMARY KEY (acc_AccesoID),
    KEY idx_acceso_empresa (emp_EmpresaID),
    KEY idx_acceso_usuario (usu_UsuarioID),
    KEY idx_acceso_fecha (acc_Fecha),
    CONSTRAINT fk_acceso_empresa
        FOREIGN KEY (emp_EmpresaID)
        REFERENCES empresa(emp_EmpresaID)
        ON DELETE SET NULL
        ON UPDATE CASCADE,
    CONSTRAINT fk_acceso_usuario
        FOREIGN KEY (usu_UsuarioID)
        REFERENCES usuario(usu_UsuarioID)
        ON DELETE SET NULL
        ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =========================================================
-- DATOS BASE
-- =========================================================

INSERT INTO rol (
    emp_EmpresaID,
    rol_Nombre,
    rol_Descripcion,
    rol_Permisos,
    rol_EsSistema,
    rol_Estatus
)
VALUES
(
    NULL,
    'Super Administrador',
    'Acceso completo a todas las empresas y configuración general del SaaS.',
    '{"empresas":true,"usuarios":true,"plantillas":true,"evaluaciones":true,"resultados":true,"configuracion":true}',
    1,
    1
),
(
    NULL,
    'Administrador Empresa',
    'Administrador de una empresa dentro del SaaS.',
    '{"usuarios":true,"participantes":true,"plantillas":true,"evaluaciones":true,"resultados":true,"configuracion":true}',
    1,
    1
),
(
    NULL,
    'Evaluador',
    'Usuario con permiso para contestar evaluaciones asignadas.',
    '{"evaluaciones_contestar":true}',
    1,
    1
),
(
    NULL,
    'Participante',
    'Usuario participante dentro de una evaluación.',
    '{"evaluaciones_contestar":true,"mis_resultados":true}',
    1,
    1
);

INSERT INTO plantilla_categoria (
    emp_EmpresaID,
    cat_Nombre,
    cat_Descripcion,
    cat_EsGlobal,
    cat_Estatus
)
VALUES
(NULL, 'Desempeño', 'Plantillas para evaluación de desempeño.', 1, 1),
(NULL, 'Clima laboral', 'Plantillas para encuestas de clima laboral.', 1, 1),
(NULL, 'NOM-035', 'Plantillas relacionadas con NOM-035.', 1, 1),
(NULL, 'Capacitación', 'Plantillas para evaluar cursos o capacitaciones.', 1, 1),
(NULL, 'Personalizada', 'Plantillas libres creadas por cada empresa.', 1, 1);