-- Raf Gezgini ürün görselleri tablosu
-- MySQL 8.0.16+ için hazırlanmıştır.
-- Tekrar çalıştırılabilir; mevcut tabloyu veya verileri değiştirmez.
-- Görsel dosyalarının kendisi veritabanında değil, güvenli dosya/nesne
-- depolamasında tutulur. Bu tablo yalnızca dosya ve moderasyon bilgisini tutar.

USE `raf_gezgini`;

START TRANSACTION;

CREATE TABLE IF NOT EXISTS `urun_gorselleri` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `urun_id` BIGINT NOT NULL,

    `gorsel_turu` VARCHAR(30) NOT NULL,
    `kaynak_turu` VARCHAR(30) NOT NULL DEFAULT 'kullanici_yuklemesi',
    `kaynak_adi` VARCHAR(150) NULL,
    `kaynak_url` VARCHAR(2048) NULL,

    `disk` VARCHAR(50) NULL,
    `depolama_yolu` VARCHAR(500) NULL,
    `orijinal_dosya_adi` VARCHAR(255) NULL,
    `mime_turu` VARCHAR(100) NULL,
    `dosya_boyutu` BIGINT UNSIGNED NULL,
    `genislik` INT UNSIGNED NULL,
    `yukseklik` INT UNSIGNED NULL,
    `dosya_ozeti_sha256` CHAR(64) NULL,

    `aciklama` VARCHAR(500) NULL,
    `ana_gorsel_mi` TINYINT(1) NOT NULL DEFAULT 0,
    `onay_durumu` VARCHAR(20) NOT NULL DEFAULT 'beklemede',
    `inceleme_notu` VARCHAR(1000) NULL,
    `red_nedeni` VARCHAR(1000) NULL,

    `ekleyen_kullanici_id` CHAR(36) NULL,
    `ekleyen_yonetici_id` BIGINT UNSIGNED NULL,
    `inceleyen_yonetici_id` BIGINT UNSIGNED NULL,
    `inceleme_tarihi` DATETIME(6) NULL,

    `olusturulma_tarihi` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
    `guncellenme_tarihi` DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
    `silinme_tarihi` DATETIME(6) NULL,

    -- MySQL'de koşullu benzersiz indeks yerine üretilen alan kullanılır.
    -- Böylece silinmemiş bir ürünün en fazla bir ana görseli olabilir.
    `aktif_ana_gorsel_urun_id` BIGINT
        GENERATED ALWAYS AS (
            CASE
                WHEN `ana_gorsel_mi` = 1 AND `silinme_tarihi` IS NULL THEN `urun_id`
                ELSE NULL
            END
        ) STORED,

    PRIMARY KEY (`id`),

    UNIQUE KEY `uq_urun_gorselleri_urun_dosya_ozeti`
        (`urun_id`, `dosya_ozeti_sha256`),
    UNIQUE KEY `uq_urun_gorselleri_aktif_ana_gorsel`
        (`aktif_ana_gorsel_urun_id`),

    KEY `ix_urun_gorselleri_urun_durum`
        (`urun_id`, `onay_durumu`, `silinme_tarihi`),
    KEY `ix_urun_gorselleri_kullanici_tarih`
        (`ekleyen_kullanici_id`, `olusturulma_tarihi`),
    KEY `ix_urun_gorselleri_inceleme`
        (`onay_durumu`, `olusturulma_tarihi`),
    KEY `ix_urun_gorselleri_kaynak`
        (`kaynak_turu`, `kaynak_adi`),

    CONSTRAINT `fk_urun_gorselleri_urun`
        FOREIGN KEY (`urun_id`) REFERENCES `urunler` (`id`)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `fk_urun_gorselleri_ekleyen_kullanici`
        FOREIGN KEY (`ekleyen_kullanici_id`) REFERENCES `kullanicilar` (`id`)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT `fk_urun_gorselleri_ekleyen_yonetici`
        FOREIGN KEY (`ekleyen_yonetici_id`) REFERENCES `users` (`id`)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT `fk_urun_gorselleri_inceleyen_yonetici`
        FOREIGN KEY (`inceleyen_yonetici_id`) REFERENCES `users` (`id`)
        ON UPDATE CASCADE ON DELETE SET NULL,

    CONSTRAINT `ck_urun_gorselleri_tur`
        CHECK (`gorsel_turu` IN (
            'on_yuz',
            'arka_yuz',
            'barkod',
            'icerik_etiketi',
            'besin_degeri',
            'diger'
        )),
    CONSTRAINT `ck_urun_gorselleri_kaynak_turu`
        CHECK (`kaynak_turu` IN (
            'kullanici_yuklemesi',
            'yonetici_yuklemesi',
            'resmi_market',
            'gs1',
            'open_food_facts',
            'diger'
        )),
    CONSTRAINT `ck_urun_gorselleri_onay_durumu`
        CHECK (`onay_durumu` IN (
            'beklemede',
            'onaylandi',
            'supheli',
            'reddedildi'
        )),
    CONSTRAINT `ck_urun_gorselleri_dosya_veya_url`
        CHECK (`depolama_yolu` IS NOT NULL OR `kaynak_url` IS NOT NULL),
    CONSTRAINT `ck_urun_gorselleri_disk_yol_birlikte`
        CHECK (`depolama_yolu` IS NULL OR `disk` IS NOT NULL),
    CONSTRAINT `ck_urun_gorselleri_boyutlar`
        CHECK (
            (`genislik` IS NULL AND `yukseklik` IS NULL)
            OR (`genislik` > 0 AND `yukseklik` > 0)
        ),
    CONSTRAINT `ck_urun_gorselleri_ana_onayli`
        CHECK (`ana_gorsel_mi` = 0 OR `onay_durumu` = 'onaylandi'),
    CONSTRAINT `ck_urun_gorselleri_red_nedeni`
        CHECK (`onay_durumu` <> 'reddedildi' OR NULLIF(TRIM(`red_nedeni`), '') IS NOT NULL),
    CONSTRAINT `ck_urun_gorselleri_inceleme_bilgisi`
        CHECK (
            `onay_durumu` = 'beklemede'
            OR (`inceleyen_yonetici_id` IS NOT NULL AND `inceleme_tarihi` IS NOT NULL)
        )
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_turkish_ci;

COMMIT;
