-- =============================================================================
-- Migración:    0013_create_producto_imagenes_table
-- Sprint:       1.3 — schema del catálogo
-- Tabla:        producto_imagenes
-- Aplica en:    BD de cada tenant (innovium_<slug>)
-- Dependencias: 0011 (productos).
--
-- Descripción:
--   Galería de fotos de un producto. Cada imagen vive en Cloudflare R2
--   con prefijo del tenant; acá guardamos solo el path lógico.
--
-- Notas de diseño:
--   - r2_path: path completo dentro del bucket único `innovium-prod-storage`
--     ej: "tenants/infinia/productos/urn-001/01.jpg". El prefijo del
--     tenant lo aplica automáticamente App\Core\Storage (ADR-003).
--     Acá guardamos el path tal cual va a R2 para evitar ambigüedad.
--   - tipo ENUM:
--       · principal → la foto principal (el campo
--                     productos.imagen_principal_id apunta acá vía
--                     ALTER en migración 0017).
--       · galeria   → fotos adicionales del producto.
--       · 360_frame → cada frame del visor 360° (orden 1-36).
--                     Sprint 1.3 deja la columna lista; Sprint 2.x
--                     implementa el visor.
--   - orden: para galería estática (1=primera foto). Para 360_frame
--     representa el frame number (1-36 típicamente).
--   - descripcion: texto alt para accesibilidad. NULL aceptable pero
--     desaconsejado; UI debería forzarlo en Sprint 1.4.
--   - Sin actualizado_en: las imágenes en R2 son inmutables — para
--     reemplazar se borra esta fila y se inserta otra con nuevo r2_path.
--   - ON DELETE CASCADE: si el producto se borra físicamente, sus
--     imágenes también (igual que variantes).
-- =============================================================================

CREATE TABLE producto_imagenes (
    id              BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
                    COMMENT 'PK auto-incremental.',
    producto_id     BIGINT UNSIGNED NOT NULL
                    COMMENT 'FK → productos.id (CASCADE).',
    r2_path         VARCHAR(500)    NOT NULL
                    COMMENT 'Path completo en R2 (ej: "tenants/infinia/productos/urn-001/01.jpg").',
    orden           INT             NOT NULL DEFAULT 0
                    COMMENT 'Orden en galería (1=primera) o frame number en 360 (1-36).',
    descripcion     VARCHAR(200)        NULL
                    COMMENT 'Texto alt para accesibilidad. UI Sprint 1.4 lo va a hacer requerido.',
    tipo            ENUM('principal', 'galeria', '360_frame')
                    NOT NULL DEFAULT 'galeria'
                    COMMENT 'principal=foto principal, galeria=adicional, 360_frame=visor 360 (Sprint 2.x).',
    creado_en       DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP
                    COMMENT 'UTC de creación. Inmutable. (Imágenes en R2 son append-only.)',
    PRIMARY KEY (id),
    KEY idx_producto_imagenes_producto_orden (producto_id, orden),
    KEY idx_producto_imagenes_tipo (tipo),
    CONSTRAINT fk_producto_imagenes_producto
        FOREIGN KEY (producto_id) REFERENCES productos (id)
        ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  COMMENT='Galería de fotos de productos en R2. tipo=360_frame preparado para Sprint 2.x.';
