-- ===========================================================================
-- Migration: Create supplier_raw_material
-- Date: 2026-05-05
-- Context: Recipe Calculator — Raw Materials module (v1)
-- ===========================================================================
-- Główna tabela bazy surowców. Każdy rekord jest własnością konkretnego
-- dostawcy — izolacja gwarantowana przez supplier_id w każdym zapytaniu.
--
-- Kluczowe decyzje projektowe:
--
--   current_price_net (denormalizacja):
--     Pole szybkiego odczytu dla UI listy surowców. Trzyma aktualną cenę
--     netto z supplier_raw_material_price_history (valid_from <= CURDATE()).
--     Aktualizowane w TransactionManager przy INSERT nowej ceny jeśli
--     nowa cena jest już aktywna (valid_from <= CURDATE()).
--     Ceny z przyszłą datą NIE aktualizują tego pola.
--     NIGDY nie używać do kalkulacji receptur — tylko do prezentacji UI.
--
--   is_archived (soft delete):
--     Zarchiwizowany surowiec nie może być dodany do NOWEJ receptury.
--     Twarde usunięcie jest możliwe z dwuetapowym potwierdzeniem,
--     ale API zwraca 409 jeśli surowiec jest używany w recepturach.
--
-- ===========================================================================
-- UWAGA: Pola v2 (origin_country, storage_temp_min, storage_temp_max,
--   shelf_life_days) zostały usunięte w trakcie v1 — nie są potrzebne
--   na etapie zarządzania kalkulatorem.
-- ===========================================================================

CREATE TABLE IF NOT EXISTS `supplier_raw_material` (
    `id`                    INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    `supplier_id`           INT(11)         NOT NULL COMMENT 'FK → material_supplier.id — izolacja per dostawca',
    `sku`                   VARCHAR(100)    NULL     COMMENT 'Wewnętrzny kod / indeks surowca (opcjonalny, unikalny per dostawca)',
    `name`                  VARCHAR(255)    NOT NULL COMMENT 'Nazwa surowca',
    `description`           TEXT            NULL     COMMENT 'Opis / notatka technologiczna',
    `id_unit`               INT(11)         NOT NULL COMMENT 'FK → unit.id — jednostka bazowa (kg, l, szt, ...)',
    `id_category`           INT UNSIGNED    NULL     COMMENT 'FK → supplier_raw_material_category.id (opcjonalne)',
    `waste_perc`            DECIMAL(5,2)    NOT NULL DEFAULT 0.00 COMMENT 'Procent odpadów 0-100 — używany w kalkulacji receptur',
    `current_price_net`     DECIMAL(10,4)   NULL     COMMENT 'Denormalizacja — aktualna cena netto za jednostkę bazową (tylko UI, nie do kalkulacji)',
    `vat_rate`              DECIMAL(5,2)    NULL     COMMENT 'Stawka VAT w % (opcjonalna)',
    -- Status
    `is_archived`           TINYINT(1)      NOT NULL DEFAULT 0 COMMENT '0 = aktywny, 1 = zarchiwizowany (soft delete)',
    -- Timestamps
    `created_at`            DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at`            DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

    PRIMARY KEY (`id`),

    -- Izolacja per dostawca — podstawowy filtr w każdym zapytaniu
    KEY `idx_srm_supplier`          (`supplier_id`),

    -- Composite: wyszukiwanie po nazwie w obrębie dostawcy
    KEY `idx_srm_supplier_name`     (`supplier_id`, `name`),

    -- Composite: filtrowanie aktywnych/archiwalnych per dostawca
    KEY `idx_srm_supplier_archived` (`supplier_id`, `is_archived`),

    -- SKU: unikalność per dostawca + wyszukiwanie
    UNIQUE KEY `uq_srm_supplier_sku` (`supplier_id`, `sku`),

    CONSTRAINT `fk_srm_supplier`
        FOREIGN KEY (`supplier_id`) REFERENCES `material_supplier` (`id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,

    CONSTRAINT `fk_srm_unit`
        FOREIGN KEY (`id_unit`) REFERENCES `unit` (`id`),

    CONSTRAINT `fk_srm_category`
        FOREIGN KEY (`id_category`) REFERENCES `supplier_raw_material_category` (`id`)
        ON DELETE SET NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

