-- =============================================================================
-- Migración:    0011_create_productos_table
-- Sprint:       1.3 — schema del catálogo
-- Tabla:        productos
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0009 (categorias), 0010 (niveles).
--
-- Descripción:
--   El corazón del módulo. Acá viven urnas, ataúdes, relicarios,
--   ánforas, capilla velatoria, traslados, exhumaciones, **y los planes
--   completos** (con tipo='plan'). Los componentes de un plan se
--   describen en planes_lineas.
--
-- Notas de diseño:
--
--   · tipo='plan' identifica registros que son planes funerarios (NI o
--     NF). Sus líneas vienen en planes_lineas.
--
--   · Precio puede estar en CLP, en UF, o en ambos. disponible_para
--     marca para qué tipo de contrato se ofrece (NI=necesidad inmediata,
--     NF=necesidad futura, AMBOS).
--
--   · vendible_como_componente y vendible_como_adicional son flags
--     INDEPENDIENTES. Un mismo producto puede:
--     - Ser componente de un plan (planes_lineas lo referencia).
--     - Y a la vez venderse suelto en un contrato como adicional.
--     Caso típico: relicarios.
--
--   · stock_actual y requiere_stock son placeholders para el módulo
--     bodega (Sprint 5.x+). En Sprint 1.3 quedan con default 0/false.
--
--   · imagen_principal_id es FK a producto_imagenes.id PERO la
--     constraint NO se crea acá — la tabla producto_imagenes todavía
--     no existe. El FK se agrega en la migración 0017_alter_productos_
--     add_imagen_fk.sql después de crear producto_imagenes (FK circular
--     productos↔producto_imagenes resuelto en dos pasos).
--
--   · ON DELETE RESTRICT en categoria_id y nivel_id: borrar una
--     categoría/nivel con productos vivos requiere primero limpiar.
--     Soft delete del producto NO afecta el FK (eliminado_en sigue
--     siendo NULL en categorias).
-- =============================================================================

CREATE TABLE productos (
    id                          BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                                COMMENT 'PK auto-incremental.',
    codigo                      VARCHAR(50)     NOT NULL
                                COMMENT 'Código interno único (ej: "URN-OLM-001"). Validado en código.',
    nombre                      VARCHAR(200)    NOT NULL
                                COMMENT 'Nombre completo (ej: "Urna de Olmo Tradicional").',
    descripcion_corta           VARCHAR(500)        NULL
                                COMMENT 'Resumen para tarjetas de catálogo. Plain text.',
    descripcion_larga           TEXT                NULL
                                COMMENT 'Detalle completo para vista de producto. HTML/markdown según UI.',
    tipo                        ENUM('producto', 'servicio', 'plan')
                                NOT NULL DEFAULT 'producto'
                                COMMENT 'producto=físico, servicio=intangible, plan=composición de líneas.',
    categoria_id                BIGINT UNSIGNED NOT NULL
                                COMMENT 'FK → categorias.id (RESTRICT). Todo producto pertenece a una categoría.',
    nivel_id                    BIGINT UNSIGNED     NULL
                                COMMENT 'FK → niveles.id (RESTRICT). NULL para servicios y planes.',
    precio_base_clp             DECIMAL(12,2)   NOT NULL DEFAULT 0
                                COMMENT 'Precio NI en CLP. 0 si solo se vende en UF.',
    precio_base_uf              DECIMAL(8,2)        NULL
                                COMMENT 'Precio NF en UF. NULL si no aplica.',
    disponible_para             ENUM('NI', 'NF', 'AMBOS')
                                NOT NULL DEFAULT 'AMBOS'
                                COMMENT 'NI=necesidad inmediata, NF=necesidad futura, AMBOS=ambas.',
    vendible_como_componente    TINYINT(1)      NOT NULL DEFAULT 1
                                COMMENT '1=puede entrar en planes_lineas (componente de plan).',
    vendible_como_adicional     TINYINT(1)      NOT NULL DEFAULT 1
                                COMMENT '1=puede venderse suelto en contrato como adicional al plan.',
    requiere_stock              TINYINT(1)      NOT NULL DEFAULT 0
                                COMMENT '1=control de bodega activo. Sprint 5.x+.',
    stock_actual                INT                 NULL
                                COMMENT 'Cantidad disponible. NULL hasta que requiere_stock=1.',
    imagen_principal_id         BIGINT UNSIGNED     NULL
                                COMMENT 'FK → producto_imagenes.id (SET NULL). Constraint creada en 0017_alter.',
    activo                      TINYINT(1)      NOT NULL DEFAULT 1
                                COMMENT '1=visible en catálogo, 0=oculto sin borrar.',
    creado_en                   DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                                COMMENT 'UTC de creación. Inmutable.',
    actualizado_en              DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                                                         ON UPDATE CURRENT_TIMESTAMP
                                COMMENT 'UTC de la última edición. Auto-actualizado por MySQL.',
    eliminado_en                DATETIME            NULL
                                COMMENT 'UTC del soft-delete. NULL = activo.',
    PRIMARY KEY (id),
    UNIQUE KEY uq_productos_codigo (codigo),
    KEY idx_productos_tipo (tipo),
    KEY idx_productos_categoria (categoria_id),
    KEY idx_productos_nivel (nivel_id),
    KEY idx_productos_disponible (disponible_para, activo),
    KEY idx_productos_vendible_componente (vendible_como_componente, activo),
    KEY idx_productos_vendible_adicional (vendible_como_adicional, activo),
    KEY idx_productos_eliminado_en (eliminado_en),
    CONSTRAINT fk_productos_categoria
        FOREIGN KEY (categoria_id) REFERENCES categorias (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT fk_productos_nivel
        FOREIGN KEY (nivel_id) REFERENCES niveles (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Catálogo principal: productos físicos, servicios y planes. tipo=plan para planes funerarios.';
