-- Catalogo base de unidades de medida

CREATE TABLE IF NOT EXISTS unidades_medida (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(10) NOT NULL,
    descripcion VARCHAR(120) NOT NULL,
    simbolo VARCHAR(20) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at DATETIME NOT NULL,
    updated_at DATETIME NULL,
    deleted_at DATETIME NULL,
    UNIQUE KEY uq_unidades_codigo (codigo),
    KEY idx_unidades_descripcion (descripcion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT IGNORE INTO unidades_medida (id, codigo, descripcion, simbolo, estado, created_at) VALUES
(1, 'NIU', 'Unidad', 'UND', 1, NOW()),
(2, 'ZZ', 'Servicio', 'SER', 1, NOW()),
(3, 'HUR', 'Hora', 'H', 1, NOW()),
(4, 'KGM', 'Kilogramo', 'KG', 1, NOW()),
(5, 'LTR', 'Litro', 'L', 1, NOW()),
(6, 'MTR', 'Metro', 'M', 1, NOW()),
(7, 'C62', 'Unidad de producto', 'UND', 1, NOW());

SET @sql_add_catalogo_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD COLUMN unidad_medida_id BIGINT UNSIGNED NULL AFTER tipo',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND column_name = 'unidad_medida_id'
);
PREPARE stmt_add_catalogo_um FROM @sql_add_catalogo_um;
EXECUTE stmt_add_catalogo_um;
DEALLOCATE PREPARE stmt_add_catalogo_um;

SET @sql_add_detalle_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobante_detalles ADD COLUMN unidad_medida_id BIGINT UNSIGNED NULL AFTER catalogo_item_id',
        'SELECT 1'
    )
    FROM information_schema.columns
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobante_detalles'
      AND column_name = 'unidad_medida_id'
);
PREPARE stmt_add_detalle_um FROM @sql_add_detalle_um;
EXECUTE stmt_add_detalle_um;
DEALLOCATE PREPARE stmt_add_detalle_um;

SET @sql_fk_catalogo_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE catalogo_items ADD CONSTRAINT fk_catalogo_unidad_medida FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'catalogo_items'
      AND constraint_name = 'fk_catalogo_unidad_medida'
);
PREPARE stmt_fk_catalogo_um FROM @sql_fk_catalogo_um;
EXECUTE stmt_fk_catalogo_um;
DEALLOCATE PREPARE stmt_fk_catalogo_um;

SET @sql_fk_detalle_um := (
    SELECT IF(
        COUNT(*) = 0,
        'ALTER TABLE facturacion_comprobante_detalles ADD CONSTRAINT fk_fact_detalle_unidad_medida FOREIGN KEY (unidad_medida_id) REFERENCES unidades_medida(id)',
        'SELECT 1'
    )
    FROM information_schema.table_constraints
    WHERE table_schema = DATABASE()
      AND table_name = 'facturacion_comprobante_detalles'
      AND constraint_name = 'fk_fact_detalle_unidad_medida'
);
PREPARE stmt_fk_detalle_um FROM @sql_fk_detalle_um;
EXECUTE stmt_fk_detalle_um;
DEALLOCATE PREPARE stmt_fk_detalle_um;

UPDATE catalogo_items ci
LEFT JOIN unidades_medida um ON um.codigo = ci.unidad_medida
SET ci.unidad_medida_id = um.id
WHERE ci.unidad_medida_id IS NULL
  AND ci.deleted_at IS NULL;

UPDATE facturacion_comprobante_detalles d
LEFT JOIN catalogo_items ci ON ci.id = d.catalogo_item_id
LEFT JOIN unidades_medida um ON um.codigo = COALESCE(ci.unidad_medida, d.unidad_medida)
SET d.unidad_medida_id = um.id
WHERE d.unidad_medida_id IS NULL
  AND d.deleted_at IS NULL;
