-- Active: 1755472439040@@dev.wappcom.com@3306@nucleo_base
-- ============================================
-- TABLA: forms
-- Descripción: Definición de Formularios (Maestro)
-- ============================================
DROP TABLE IF EXISTS `forms`;

CREATE TABLE `forms` (
    `form_id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'Identificador único del formulario',
    `form_title` VARCHAR(255) NOT NULL COMMENT 'Título del formulario',
    `form_slug` VARCHAR(255) UNIQUE COMMENT 'Slug/identificador legible',
    `form_description` TEXT COMMENT 'Descripción del formulario',
    `form_settings` TEXT COMMENT 'JSON/text con opciones: confirmation, notifications, redirect, etc',
    `form_notify_email` VARCHAR(255) DEFAULT NULL COMMENT 'Email para notificaciones',
    `form_user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT 'Usuario creador',
    `form_ent_id` INT UNSIGNED DEFAULT NULL COMMENT 'ID de la entidad',
    `form_site_id` INT NOT NULL DEFAULT 1 COMMENT 'ID del sitio',
    `form_created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación del registro',
    `form_updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha de última actualización',
    `form_status` INT DEFAULT '1' COMMENT 'Estado (1=activo, 0=inactivo)'
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Definición de Formularios (Maestro)';

-- ============================================
-- TABLA: forms_fields
-- Descripción: Campos pertenecientes a cada formulario
-- ============================================
DROP TABLE IF EXISTS `forms_fields`;

CREATE TABLE `forms_fields` (
    `form_fld_id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'Identificador único del campo',
    `form_fld_form_id` BIGINT UNSIGNED NOT NULL COMMENT 'Referencia al formulario (form_id)',
    `form_fld_ent_id` INT UNSIGNED DEFAULT NULL COMMENT 'ID de la entidad',
    `form_fld_site_id` INT NOT NULL DEFAULT 1 COMMENT 'ID del sitio',
    `form_fld_name` VARCHAR(255) NOT NULL COMMENT 'Nombre interno del campo (ej: email)',
    `form_fld_label` VARCHAR(255) DEFAULT NULL COMMENT 'Etiqueta visible para UI',
    `form_fld_type` VARCHAR(50) DEFAULT 'text' COMMENT 'Tipo de campo (text, textarea, email, select, checkbox, file, etc)',
    `form_fld_options` TEXT COMMENT 'Opciones para select/checkbox (JSON o CSV)',
    `form_fld_required` TINYINT(1) DEFAULT 0 COMMENT '1=obligatorio,0=opcional',
    `form_fld_order` INT DEFAULT 0 COMMENT 'Orden de visualización',
    `form_fld_placeholder` VARCHAR(255) DEFAULT NULL COMMENT 'Placeholder para el input',
    `form_fld_created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación del registro',
    `form_fld_updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha de última actualización',
    `form_fld_status` INT DEFAULT '1' COMMENT 'Estado del campo (1=activo,0=inactivo)',
    KEY `idx_forms_fields_form` (`form_fld_form_id`),
    KEY `idx_forms_fields_ent` (`form_fld_ent_id`),
    KEY `idx_forms_fields_site` (`form_fld_site_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Campos pertenecientes a cada formulario';

-- ============================================
-- TABLA: forms_entries
-- Descripción: Entradas/Envios generados por los formularios
-- ============================================
DROP TABLE IF EXISTS `forms_entries`;

CREATE TABLE `forms_entries` (
    `form_entry_id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT 'Identificador único del envío/entrada',
    `form_entry_form_id` BIGINT UNSIGNED NOT NULL COMMENT 'Referencia al formulario (form_id)',
    `form_entry_ent_id` INT UNSIGNED DEFAULT NULL COMMENT 'ID de la entidad',
    `form_entry_site_id` INT NOT NULL DEFAULT 1 COMMENT 'ID del sitio',
    `form_entry_date` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha del envío',
    `form_entry_ip` VARCHAR(45) DEFAULT NULL COMMENT 'IP del remitente',
    `form_entry_user_id` BIGINT UNSIGNED DEFAULT NULL COMMENT 'Usuario asociado (si aplica)',
    `form_entry_meta` TEXT COMMENT 'Metadatos adicionales (JSON)',
    `form_entry_created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Fecha de creación del registro',
    `form_entry_updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Fecha de última actualización',
    `form_entry_status` INT DEFAULT '1' COMMENT 'Estado (1=activo,0=eliminado)',
    KEY `idx_forms_entries_form` (`form_entry_form_id`),
    KEY `idx_forms_entries_ent` (`form_entry_ent_id`),
    KEY `idx_forms_entries_site` (`form_entry_site_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Entradas/Envios generados por los formularios';

-- ============================================
-- TABLA: forms_values
-- Descripción: Valores por campo de cada entrada (EAV simple)
-- ============================================
DROP TABLE IF EXISTS `forms_values`;

CREATE TABLE `forms_values` (
    `form_val_entry_id` BIGINT UNSIGNED NOT NULL COMMENT 'Referencia al envío (form_entry_id)',
    `form_val_field_id` BIGINT UNSIGNED NOT NULL COMMENT 'Referencia al campo (form_fld_id)',
    `form_val_ent_id` INT UNSIGNED DEFAULT NULL COMMENT 'ID de la entidad',
    `form_val_site_id` INT NOT NULL DEFAULT 1 COMMENT 'ID del sitio',
    `form_val_value` TEXT COMMENT 'Valor almacenado (texto, json, etc)',
    `form_val_file_id` BIGINT UNSIGNED DEFAULT NULL COMMENT 'Si el campo es archivo, referencia al id del archivo externo',
    `form_val_order` INT DEFAULT 0 COMMENT 'Orden (si aplica)',
    PRIMARY KEY (
        `form_val_entry_id`,
        `form_val_field_id`
    ),
    KEY `idx_forms_values_field` (`form_val_field_id`),
    KEY `idx_forms_values_ent` (`form_val_ent_id`),
    KEY `idx_forms_values_site` (`form_val_site_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Valores por campo de cada entrada (EAV simple)';

-- ============================================
-- TABLA: forms_files
-- Descripción: Mapeo de archivos subidos por entrada
-- ============================================
DROP TABLE IF EXISTS `forms_files`;

CREATE TABLE `forms_files` (
    `form_file_entry_id` BIGINT UNSIGNED NOT NULL COMMENT 'Referencia al envío (form_entry_id)',
    `form_file_file_id` BIGINT UNSIGNED NOT NULL COMMENT 'ID del archivo en el sistema de archivos/tabla de archivos',
    `form_file_ent_id` INT UNSIGNED DEFAULT NULL COMMENT 'ID de la entidad',
    `form_file_site_id` INT NOT NULL DEFAULT 1 COMMENT 'ID del sitio',
    `form_file_field` VARCHAR(255) DEFAULT NULL COMMENT 'Nombre del campo al que pertenece el archivo',
    `form_file_name` VARCHAR(255) DEFAULT NULL COMMENT 'Nombre original del archivo',
    `form_file_size` INT DEFAULT NULL COMMENT 'Tamaño en bytes',
    `form_file_mime` VARCHAR(100) DEFAULT NULL COMMENT 'Tipo MIME',
    PRIMARY KEY (
        `form_file_entry_id`,
        `form_file_file_id`
    ),
    KEY `idx_forms_files_ent` (`form_file_ent_id`),
    KEY `idx_forms_files_site` (`form_file_site_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = 'Mapeo de archivos subidos por entrada';

-- ============================================
-- DATOS DE EJEMPLO
-- ============================================
-- Seed de ejemplo: formulario de contacto
INSERT INTO
    `forms` (
        `form_title`,
        `form_slug`,
        `form_description`,
        `form_ent_id`,
        `form_site_id`,
        `form_created_at`,
        `form_status`
    )
VALUES (
        'Formulario de contacto',
        'contacto',
        'Formulario de contacto básico',
        1,
        1,
        NOW(),
        1
    );

-- Campos ejemplo para el formulario creado (asume fm_id = 1)
INSERT INTO
    `forms_fields` (
        `form_fld_form_id`,
        `form_fld_name`,
        `form_fld_label`,
        `form_fld_type`,
        `form_fld_required`,
        `form_fld_order`,
        `form_fld_placeholder`
    )
VALUES (
        1,
        'name',
        'Nombre',
        'text',
        1,
        1,
        'Tu nombre'
    ),
    (
        1,
        'email',
        'Correo electrónico',
        'email',
        1,
        2,
        'tu@correo.com'
    ),
    (
        1,
        'message',
        'Mensaje',
        'textarea',
        1,
        3,
        'Escribe tu mensaje'
    ),
    (
        1,
        'attachment',
        'Adjunto',
        'file',
        0,
        4,
        NULL
    );