-- Schema para módulo de Costos
-- Ejecutar en orden

-- ============================================================
-- 0. Monedas (para precios en distintas divisas)
-- ============================================================
CREATE TABLE IF NOT EXISTS moneda (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    codigo VARCHAR(10) NOT NULL,
    cotizacion DECIMAL(12,2) NOT NULL DEFAULT 1,
    activo TINYINT(1) DEFAULT 1,
    fecha_modificacion DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Moneda base
INSERT IGNORE INTO moneda (nombre, codigo, cotizacion) VALUES ('Pesos Argentinos', 'ARS', 1);

-- Agregar moneda_id a tela_articulo (ALTER solo si no existe la columna)
-- ALTER TABLE tela_articulo ADD COLUMN moneda_id INT DEFAULT NULL AFTER costo_base;

-- ============================================================
-- 1. Maestro de tipos de avío (elástico, gomaespuma, etc.)
-- ============================================================
CREATE TABLE IF NOT EXISTS avio_tipo (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    unidad_medida VARCHAR(20) DEFAULT 'unidad',  -- "metro", "unidad", "kg"
    precio_unitario DECIMAL(10,2) NOT NULL DEFAULT 0,
    moneda_id INT DEFAULT NULL,                   -- NULL = pesos
    activo TINYINT(1) DEFAULT 1,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    fecha_modificacion DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_nombre (nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 2. Artículo de producto (sin talle ni color)
-- Para ALFEST: primeros 4 dígitos del SKU = codigo_articulo
-- ============================================================
CREATE TABLE IF NOT EXISTS articulo_producto (
    id INT AUTO_INCREMENT PRIMARY KEY,
    marca VARCHAR(100) NOT NULL,
    codigo_articulo VARCHAR(20) NOT NULL,
    nombre VARCHAR(200) NOT NULL,
    genero VARCHAR(20),
    costura_precio_maximo DECIMAL(10,2),
    costura_precio_actual DECIMAL(10,2),
    costo_otros DECIMAL(10,2) DEFAULT 120.00,
    activo TINYINT(1) DEFAULT 1,
    fecha_alta DATETIME DEFAULT CURRENT_TIMESTAMP,
    fecha_modificacion DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_marca_codigo (marca, codigo_articulo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 3. Telas por artículo (corte modelo) - relación N:1
-- Cada artículo puede fabricarse con varias telas alternativas
-- ============================================================
CREATE TABLE IF NOT EXISTS articulo_producto_tela (
    id INT AUTO_INCREMENT PRIMARY KEY,
    articulo_producto_id INT NOT NULL,
    tela_articulo_id INT DEFAULT NULL,
    tela_nombre VARCHAR(100),
    kg_por_prenda DECIMAL(10,6) NOT NULL,
    prendas_referencia INT,
    kg_referencia DECIMAL(10,2),
    es_principal TINYINT(1) DEFAULT 0,
    observaciones VARCHAR(255),
    FOREIGN KEY (articulo_producto_id) REFERENCES articulo_producto(id) ON DELETE CASCADE,
    UNIQUE KEY uk_articulo_tela (articulo_producto_id, tela_articulo_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 4. Avíos por artículo (con cantidad)
-- ============================================================
CREATE TABLE IF NOT EXISTS articulo_producto_avio (
    id INT AUTO_INCREMENT PRIMARY KEY,
    articulo_producto_id INT NOT NULL,
    avio_tipo_id INT NOT NULL,
    cantidad DECIMAL(10,4) NOT NULL,
    FOREIGN KEY (articulo_producto_id) REFERENCES articulo_producto(id) ON DELETE CASCADE,
    FOREIGN KEY (avio_tipo_id) REFERENCES avio_tipo(id),
    UNIQUE KEY uk_articulo_avio (articulo_producto_id, avio_tipo_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 5. Listas de precios
-- ============================================================
CREATE TABLE IF NOT EXISTS lista_precios (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    descripcion TEXT,
    usuario_id INT,
    estado ENUM('borrador', 'exportada') DEFAULT 'borrador',
    fecha_creacion DATETIME DEFAULT CURRENT_TIMESTAMP,
    fecha_exportacion DATETIME DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS lista_precios_detalle (
    id INT AUTO_INCREMENT PRIMARY KEY,
    lista_id INT NOT NULL,
    articulo_producto_id INT NOT NULL,
    orden INT DEFAULT 0,
    precio_final DECIMAL(10,2),
    FOREIGN KEY (lista_id) REFERENCES lista_precios(id) ON DELETE CASCADE,
    FOREIGN KEY (articulo_producto_id) REFERENCES articulo_producto(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS lista_precios_snapshot (
    id INT AUTO_INCREMENT PRIMARY KEY,
    lista_id INT NOT NULL,
    articulo_producto_id INT NOT NULL,
    marca VARCHAR(100),
    codigo_articulo VARCHAR(20),
    nombre_producto VARCHAR(200),
    tela_nombre VARCHAR(100),
    tela_precio_kg DECIMAL(10,2),
    kg_por_prenda DECIMAL(10,6),
    costo_tela DECIMAL(10,2),
    costo_costura DECIMAL(10,2),
    costo_avios DECIMAL(10,2),
    avios_detalle JSON,
    costo_otros DECIMAL(10,2),
    costo_total DECIMAL(10,2),
    precio_final DECIMAL(10,2),
    margen DECIMAL(10,2),
    margen_porcentaje DECIMAL(5,2),
    fecha_snapshot DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (lista_id) REFERENCES lista_precios(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 6. Log de importaciones
-- ============================================================
CREATE TABLE IF NOT EXISTS costos_importacion_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT,
    tipo VARCHAR(50),
    archivo VARCHAR(255),
    registros_importados INT,
    fecha DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ============================================================
-- 7. Vista de costos calculados (usa tela principal)
-- ============================================================
-- Vista de costos: convierte todo a pesos usando cotización de moneda
-- Soporta herencia: si hereda_corte_modelo/costura/avios/otros, usa datos del padre
CREATE OR REPLACE VIEW vista_costos_articulo AS
SELECT
    ap.id, ap.marca, ap.codigo_articulo, ap.nombre, ap.genero,
    ap.hereda_de_id,
    ap.hereda_corte_modelo, ap.hereda_costura, ap.hereda_avios, ap.hereda_otros,
    COALESCE(apt_eff.tela_nombre, apt.tela_nombre) AS tela_nombre,
    COALESCE(apt_eff.kg_por_prenda, apt.kg_por_prenda) AS kg_por_prenda,
    COALESCE(ta_eff.costo_base, ta.costo_base) AS tela_precio_orig,
    COALESCE(mt_eff.codigo, mt.codigo, 'ARS') AS tela_moneda,
    ROUND(COALESCE(ta_eff.costo_base, ta.costo_base, 0) * COALESCE(mt_eff.cotizacion, mt.cotizacion, 1), 2) AS tela_precio_kg,
    CASE WHEN ap.hereda_costura = 1 AND ap.hereda_de_id IS NOT NULL
         THEN padre.costura_precio_maximo
         ELSE ap.costura_precio_maximo
    END AS costo_costura,
    COALESCE((
        SELECT SUM(apa.cantidad * at2.precio_unitario * COALESCE(ma.cotizacion, 1))
        FROM articulo_producto_avio apa
        JOIN avio_tipo at2 ON at2.id = apa.avio_tipo_id
        LEFT JOIN moneda ma ON ma.id = at2.moneda_id
        WHERE apa.articulo_producto_id =
            CASE WHEN ap.hereda_avios = 1 AND ap.hereda_de_id IS NOT NULL
                 THEN ap.hereda_de_id ELSE ap.id END
    ), 0) AS costo_avios,
    CASE
        WHEN COALESCE(apt_eff.tela_articulo_id, apt.tela_articulo_id) IS NOT NULL
             AND COALESCE(ta_eff.costo_base, ta.costo_base) IS NOT NULL
        THEN ROUND(COALESCE(apt_eff.kg_por_prenda, apt.kg_por_prenda)
             * COALESCE(ta_eff.costo_base, ta.costo_base)
             * COALESCE(mt_eff.cotizacion, mt.cotizacion, 1), 2)
        ELSE 0
    END AS costo_tela,
    CASE WHEN ap.hereda_otros = 1 AND ap.hereda_de_id IS NOT NULL
         THEN padre.costo_otros
         ELSE ap.costo_otros
    END AS costo_otros,
    ROUND(
        COALESCE(
            CASE WHEN ap.hereda_costura = 1 AND ap.hereda_de_id IS NOT NULL
                 THEN padre.costura_precio_maximo ELSE ap.costura_precio_maximo END,
        0) +
        COALESCE((
            SELECT SUM(apa.cantidad * at2.precio_unitario * COALESCE(ma.cotizacion, 1))
            FROM articulo_producto_avio apa
            JOIN avio_tipo at2 ON at2.id = apa.avio_tipo_id
            LEFT JOIN moneda ma ON ma.id = at2.moneda_id
            WHERE apa.articulo_producto_id =
                CASE WHEN ap.hereda_avios = 1 AND ap.hereda_de_id IS NOT NULL
                     THEN ap.hereda_de_id ELSE ap.id END
        ), 0) +
        CASE WHEN COALESCE(apt_eff.tela_articulo_id, apt.tela_articulo_id) IS NOT NULL
                  AND COALESCE(ta_eff.costo_base, ta.costo_base) IS NOT NULL
             THEN COALESCE(apt_eff.kg_por_prenda, apt.kg_por_prenda)
                  * COALESCE(ta_eff.costo_base, ta.costo_base)
                  * COALESCE(mt_eff.cotizacion, mt.cotizacion, 1)
             ELSE 0
        END +
        COALESCE(
            CASE WHEN ap.hereda_otros = 1 AND ap.hereda_de_id IS NOT NULL
                 THEN padre.costo_otros ELSE ap.costo_otros END,
        0)
    , 2) AS costo_total
FROM articulo_producto ap
LEFT JOIN articulo_producto padre ON padre.id = ap.hereda_de_id
-- Corte modelo propio (prefiere principal, sino la primera)
LEFT JOIN articulo_producto_tela apt ON apt.id = (
    SELECT id FROM articulo_producto_tela
    WHERE articulo_producto_id = ap.id
    ORDER BY es_principal DESC, id ASC LIMIT 1
)
LEFT JOIN tela_articulo ta ON ta.id = apt.tela_articulo_id
LEFT JOIN moneda mt ON mt.id = ta.moneda_id
-- Corte modelo heredado (del padre, prefiere principal)
LEFT JOIN articulo_producto_tela apt_eff ON apt_eff.id = (
    SELECT id FROM articulo_producto_tela
    WHERE articulo_producto_id = ap.hereda_de_id
    ORDER BY es_principal DESC, id ASC LIMIT 1
) AND ap.hereda_corte_modelo = 1
LEFT JOIN tela_articulo ta_eff ON ta_eff.id = apt_eff.tela_articulo_id
LEFT JOIN moneda mt_eff ON mt_eff.id = ta_eff.moneda_id;
