-- =============================================================================
-- Migración:    0014_create_planes_lineas_table
-- Sprint:       1.3 — schema del catálogo
-- Tabla:        planes_lineas
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0009 (categorias), 0010 (niveles), 0011 (productos).
--
-- Descripción:
--   Composición de un plan funerario. Cada línea define qué incluye el
--   plan: producto fijo específico, elección de cualquier producto de
--   una categoría, o elección con filtro adicional de nivel.
--
--   Plan = fila en `productos` con tipo='plan'.
--   Líneas del plan = filas acá con plan_id apuntando a ese producto.
--
-- Notas de diseño:
--
--   · modo ENUM cubre los 3 casos del modelo:
--
--     - producto_fijo:        producto_id requerido. La línea exige
--                             específicamente "Urna Olmo Tradicional".
--                             Categoría/nivel deben ser NULL.
--
--     - eleccion_categoria:   categoria_id requerido. La línea dice
--                             "elegí 3 relicarios de la categoría
--                             Relicarios". producto_id debe ser NULL.
--                             nivel_id opcional como filtro adicional.
--
--     - eleccion_nivel:       nivel_id requerido. La línea dice "elegí
--                             cualquier urna de nivel Premium".
--                             producto_id debe ser NULL.
--                             categoria_id opcional como filtro adicional.
--
--   · obligatorio: si false, el cliente puede declinar la línea
--     (típico para extras opcionales como "carro fúnebre adicional").
--
--   · cantidad: cuántas unidades incluye la línea. Para servicios
--     suele ser 1; para relicarios puede ser 3 o más.
--
--   · ON DELETE CASCADE en plan_id: si el plan se borra físicamente,
--     sus líneas mueren con él. RESTRICT en producto_id/categoria_id/
--     nivel_id: no se puede borrar nada que esté siendo usado por una
--     línea de plan vivo.
--
--   · Sin soft delete: una línea o existe o no — no tiene sentido
--     ocultarla sin borrarla. Para "desactivar temporalmente" un plan
--     se desactiva el producto padre (activo=0).
-- =============================================================================

CREATE TABLE planes_lineas (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                    COMMENT 'PK auto-incremental.',
    plan_id         BIGINT UNSIGNED NOT NULL
                    COMMENT 'FK → productos.id (CASCADE) donde tipo=plan.',
    modo            ENUM('producto_fijo', 'eleccion_categoria', 'eleccion_nivel')
                    NOT NULL
                    COMMENT 'producto_fijo, eleccion_categoria o eleccion_nivel. Define qué columna FK usar.',
    producto_id     BIGINT UNSIGNED     NULL
                    COMMENT 'FK → productos.id (RESTRICT). Requerido si modo=producto_fijo.',
    categoria_id    BIGINT UNSIGNED     NULL
                    COMMENT 'FK → categorias.id (RESTRICT). Requerido si modo=eleccion_categoria, opcional como filtro en eleccion_nivel.',
    nivel_id        BIGINT UNSIGNED     NULL
                    COMMENT 'FK → niveles.id (RESTRICT). Requerido si modo=eleccion_nivel, opcional como filtro en eleccion_categoria.',
    cantidad        INT             NOT NULL DEFAULT 1
                    COMMENT 'Cantidad de unidades incluidas en esta línea.',
    obligatorio     TINYINT(1)      NOT NULL DEFAULT 1
                    COMMENT '1=línea fija del plan, 0=el cliente puede declinarla.',
    orden_visual    INT             NOT NULL DEFAULT 0
                    COMMENT 'Orden ascendente para mostrar las líneas del plan.',
    notas           TEXT                NULL
                    COMMENT 'Texto descriptivo opcional (ej: "Incluye traslado dentro del radio urbano").',
    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.',
    PRIMARY KEY (id),
    KEY idx_planes_lineas_plan (plan_id, orden_visual),
    KEY idx_planes_lineas_modo (modo),
    KEY idx_planes_lineas_producto (producto_id),
    KEY idx_planes_lineas_categoria (categoria_id),
    KEY idx_planes_lineas_nivel (nivel_id),
    CONSTRAINT fk_planes_lineas_plan
        FOREIGN KEY (plan_id) REFERENCES productos (id)
        ON DELETE CASCADE ON UPDATE RESTRICT,
    CONSTRAINT fk_planes_lineas_producto
        FOREIGN KEY (producto_id) REFERENCES productos (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT fk_planes_lineas_categoria
        FOREIGN KEY (categoria_id) REFERENCES categorias (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT fk_planes_lineas_nivel
        FOREIGN KEY (nivel_id) REFERENCES niveles (id)
        ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Composición de planes funerarios. modo ENUM define producto fijo vs elección.';
