-- =====================================================================
-- 01_schema_nuevo.sql
-- =====================================================================
-- Crea las tablas nuevas del sistema remodelado. Es 100% ADITIVO:
-- no borra ni modifica ninguna tabla existente (actividades_diarias,
-- actividades_semanales, etc. siguen intactas después de correr esto).
--
-- Reemplaza estas 7 tablas casi-idénticas del sistema anterior:
--   actividades_diarias, actividades_semanales, actividades_mensuales,
--   actividades_trimestrales, actividades_compromisos,
--   actividades_entrenamientos, actividades_liderazgo
-- por 2 tablas:
--   actividades            -> el "encabezado" de cada actividad asignada
--   actividad_seguimiento  -> una fila por cada casilla marcable
--                             (lunes/martes/... para diarias,
--                              semana1..4 para semanales,
--                              quincena1/2 para las nuevas quincenales,
--                              una sola fila "unico" para
--                              mensual/trimestral/compromiso/
--                              entrenamiento/liderazgo)
--
-- Esto es lo que te permite agregar "quincenal" sin crear una tabla
-- más, y lo que hace que marcar un día, agregar una nota o poner a
-- alguien de respaldo sea UNA sola operación genérica en vez de 14
-- archivos PHP distintos (guardar_checkbox1-5, update_lunes..viernes,
-- guardar_semana1-4, guardar_status/C/E/L/T).
--
-- No se tocan: usuarios, areas, perfil_area, plantas, notas_semanales,
-- actividades_perfil (siguen siendo las mismas tablas). Solo se les
-- amplían un par de columnas que se quedaron cortas (ver abajo).
-- =====================================================================

CREATE TABLE IF NOT EXISTS actividades (
    id_actividad      INT NOT NULL AUTO_INCREMENT
                      COMMENT 'La migración inserta IDs explícitos por rango; después de eso, MySQL sigue solo desde el máximo insertado',
    tipo              ENUM('DIARIA','SEMANAL','QUINCENAL','MENSUAL','TRIMESTRAL',
                            'COMPROMISO','ENTRENAMIENTO','LIDERAZGO') NOT NULL,
    anio              SMALLINT NOT NULL,
    periodo           VARCHAR(10) NOT NULL
                      COMMENT 'Semana ISO 2 dígitos (01-53), mes (01-12), o trimestre (Q1-Q4)',
    fecha_formulario  DATE NOT NULL COMMENT 'Fecha en que se dio de alta la actividad',
    fecha_objetivo    VARCHAR(20) DEFAULT NULL
                      COMMENT 'Antes "fecha_actividad"; se conserva tal cual venía (algunas tablas la guardaban como texto libre)',
    area_nombre       VARCHAR(50) NOT NULL,
    descripcion       VARCHAR(500) NOT NULL,
    dia_o_mes         VARCHAR(50) DEFAULT NULL
                      COMMENT 'Antes "dia_actividad" (semanal/liderazgo) o "mes_actividad" (trimestral)',
    hora_actividad    TIME DEFAULT NULL COMMENT 'Solo aplica a DIARIA',
    status            VARCHAR(20) NOT NULL DEFAULT 'ACTIVO'
                      COMMENT 'ACTIVO / INACTIVO -- borrado suave, igual que antes',
    usuario_id        VARCHAR(100) NOT NULL COMMENT 'Correo del dueño de la actividad',
    asignada_por      VARCHAR(200) DEFAULT NULL,
    prioridad         VARCHAR(20) NOT NULL DEFAULT 'BAJA',
    creado_en         DATETIME DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id_actividad),
    KEY idx_usuario_periodo (usuario_id, tipo, anio, periodo, status),
    KEY idx_area_tipo (area_nombre, tipo, status),
    KEY idx_asignada_por (asignada_por)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

CREATE TABLE IF NOT EXISTS actividad_seguimiento (
    id_seguimiento    INT AUTO_INCREMENT PRIMARY KEY,
    id_actividad      INT NOT NULL,
    clave             VARCHAR(20) NOT NULL
                      COMMENT 'lunes..viernes | semana1..4 | quincena1/2 | unico',
    valor             VARCHAR(20) NOT NULL DEFAULT 'NO REALIZADO'
                      COMMENT 'NO REALIZADO / REALIZADO',
    nota              VARCHAR(255) DEFAULT NULL,
    vacacion          TINYINT(1) NOT NULL DEFAULT 0
                      COMMENT 'Antes vacLunes..vacViernes: el usuario está de vacaciones ese día',
    cubierto_por      VARCHAR(100) DEFAULT NULL
                      COMMENT 'Correo de quien cubre la actividad (antes columna "backup")',
    actualizado_por   VARCHAR(100) DEFAULT NULL COMMENT 'NUEVO: auditoría, quién marcó el cambio',
    actualizado_en    DATETIME DEFAULT NULL COMMENT 'NUEVO: auditoría, cuándo se marcó',
    UNIQUE KEY uniq_actividad_clave (id_actividad, clave),
    CONSTRAINT fk_seguimiento_actividad
        FOREIGN KEY (id_actividad) REFERENCES actividades (id_actividad)
        ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

-- ---------------------------------------------------------------------
-- Ajustes menores a tablas existentes (no se pierde ningún dato):
-- ---------------------------------------------------------------------

-- 1) La columna de contraseña medía 50 caracteres, suficiente para texto
--    plano pero NO para un hash bcrypt (60 caracteres). Sin esto, el
--    login nuevo fallaría al intentar guardar el hash migrado.
ALTER TABLE usuarios
    MODIFY COLUMN contrasena VARCHAR(255) NOT NULL;

-- 2) Las notas semanales estaban en varchar(16000), un tamaño inválido
--    para InnoDB en la práctica (el límite real de una fila es ~65535
--    bytes repartidos entre TODAS las columnas). TEXT es lo correcto
--    para texto largo y no tiene ese riesgo.
ALTER TABLE notas_semanales
    MODIFY COLUMN nota_semanal TEXT NOT NULL;

-- 3) Igual que en las actividades, `semana_formulario` por sí solo no
--    alcanza para saber a qué año pertenece cerca del cambio de año.
--    Se agrega `anio` (se rellena para las notas ya existentes en
--    02_migracion_datos.sql); las notas nuevas ya lo llenan bien desde
--    el formulario.
-- Nota: sin "IF NOT EXISTS" a propósito -- no todos los MySQL/MariaDB
-- de hosting compartido lo soportan en ADD COLUMN. Este script está
-- pensado para correrse una sola vez.
ALTER TABLE notas_semanales
    ADD COLUMN anio SMALLINT DEFAULT NULL AFTER semana_formulario;
