BEGIN;

SET LOCAL search_path TO raf_gezgini, public;

CREATE EXTENSION IF NOT EXISTS pgcrypto;

DO $$
DECLARE
    eksik_tablolar text;
BEGIN
    SELECT string_agg(gerekli.tablo_adi, ', ' ORDER BY gerekli.tablo_adi)
      INTO eksik_tablolar
      FROM (VALUES
          ('haneler'),
          ('hane_uyeleri'),
          ('alisveris_listeleri'),
          ('alisveris_listesi_urunleri')
      ) AS gerekli(tablo_adi)
     WHERE to_regclass('raf_gezgini.' || gerekli.tablo_adi) IS NULL;

    IF eksik_tablolar IS NOT NULL THEN
        RAISE EXCEPTION 'Hane mesajlaşması kurulamadı. Önce eksik tabloları oluşturun: %', eksik_tablolar
            USING HINT = 'Hane ve alışveriş listesi SQL dosyalarını çalıştırdıktan sonra bu dosyayı yeniden çalıştırın.';
    END IF;
END
$$;

CREATE TABLE IF NOT EXISTS hane_mesajlari (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    hane_id uuid NOT NULL REFERENCES haneler(id) ON DELETE CASCADE,
    gonderen_hane_uyesi_id uuid REFERENCES hane_uyeleri(id) ON DELETE SET NULL,
    istemci_mesaj_uuid uuid NOT NULL,
    mesaj_turu varchar(30) NOT NULL,
    icerik text,
    alisveris_listesi_id uuid REFERENCES alisveris_listeleri(id) ON DELETE SET NULL,
    liste_urunu_id uuid REFERENCES alisveris_listesi_urunleri(id) ON DELETE SET NULL,
    yanitlanan_mesaj_id uuid REFERENCES hane_mesajlari(id) ON DELETE SET NULL,
    baglanti_url text,
    baglanti_alan_adi varchar(253),
    liste_adi_anlik varchar(200),
    listeyi_olusturan_anlik varchar(160),
    liste_urun_sayisi_anlik integer,
    duzenlenme_tarihi timestamptz,
    silinme_tarihi timestamptz,
    olusturulma_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    guncellenme_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT hane_mesajlari_tur_kontrol CHECK (
        mesaj_turu IN ('metin', 'baglanti', 'resim', 'liste_baglantisi', 'sistem')
    ),
    CONSTRAINT hane_mesajlari_icerik_kontrol CHECK (
        silinme_tarihi IS NOT NULL
        OR mesaj_turu IN ('resim', 'liste_baglantisi', 'sistem')
        OR NULLIF(btrim(icerik), '') IS NOT NULL
    ),
    CONSTRAINT hane_mesajlari_baglanti_kontrol CHECK (
        mesaj_turu <> 'baglanti'
        OR (baglanti_url ~* '^https?://' AND baglanti_alan_adi IS NOT NULL)
    ),
    CONSTRAINT hane_mesajlari_liste_kontrol CHECK (
        mesaj_turu <> 'liste_baglantisi' OR alisveris_listesi_id IS NOT NULL
    ),
    CONSTRAINT hane_mesajlari_urun_sayisi_kontrol CHECK (
        liste_urun_sayisi_anlik IS NULL OR liste_urun_sayisi_anlik >= 0
    )
);

CREATE UNIQUE INDEX IF NOT EXISTS hane_mesajlari_istemci_benzersiz
    ON hane_mesajlari (gonderen_hane_uyesi_id, istemci_mesaj_uuid)
    WHERE gonderen_hane_uyesi_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS hane_mesajlari_hane_zaman_idx
    ON hane_mesajlari (hane_id, olusturulma_tarihi DESC, id DESC);
CREATE INDEX IF NOT EXISTS hane_mesajlari_liste_idx
    ON hane_mesajlari (alisveris_listesi_id)
    WHERE alisveris_listesi_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS hane_mesajlari_yanit_idx
    ON hane_mesajlari (yanitlanan_mesaj_id)
    WHERE yanitlanan_mesaj_id IS NOT NULL;

CREATE TABLE IF NOT EXISTS hane_mesaj_durumlari (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    hane_id uuid NOT NULL REFERENCES haneler(id) ON DELETE CASCADE,
    hane_uyesi_id uuid NOT NULL REFERENCES hane_uyeleri(id) ON DELETE CASCADE,
    son_okunan_hane_mesaji_id uuid REFERENCES hane_mesajlari(id) ON DELETE SET NULL,
    son_mesaj_okuma_tarihi timestamptz,
    bildirim_sessiz_mi boolean NOT NULL DEFAULT false,
    olusturulma_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    guncellenme_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT hane_mesaj_durumlari_uye_benzersiz UNIQUE (hane_uyesi_id)
);

CREATE INDEX IF NOT EXISTS hane_mesaj_durumlari_hane_idx
    ON hane_mesaj_durumlari (hane_id);

CREATE TABLE IF NOT EXISTS hane_mesaj_resimleri (
    id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
    yukleme_uuid uuid NOT NULL,
    hane_id uuid NOT NULL REFERENCES haneler(id) ON DELETE CASCADE,
    yukleyen_hane_uyesi_id uuid NOT NULL REFERENCES hane_uyeleri(id) ON DELETE CASCADE,
    hane_mesaji_id uuid REFERENCES hane_mesajlari(id) ON DELETE CASCADE,
    disk varchar(50) NOT NULL DEFAULT 'local',
    depolama_yolu text NOT NULL,
    islenmis_dosya_yolu text NOT NULL,
    kucuk_resim_yolu text,
    orijinal_ad varchar(255) NOT NULL,
    mime_turu varchar(100) NOT NULL,
    uzanti varchar(10) NOT NULL,
    boyut_bayt bigint NOT NULL,
    genislik integer NOT NULL,
    yukseklik integer NOT NULL,
    sha256 char(64) NOT NULL,
    tarama_durumu varchar(20) NOT NULL DEFAULT 'bekliyor',
    gecici_mi boolean NOT NULL DEFAULT true,
    son_kullanma_tarihi timestamptz NOT NULL DEFAULT (CURRENT_TIMESTAMP + interval '24 hours'),
    mesaja_baglanma_tarihi timestamptz,
    olusturulma_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    guncellenme_tarihi timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT hane_mesaj_resimleri_yukleme_benzersiz UNIQUE (yukleme_uuid),
    CONSTRAINT hane_mesaj_resimleri_mesaj_benzersiz UNIQUE (hane_mesaji_id),
    CONSTRAINT hane_mesaj_resimleri_mime_kontrol CHECK (
        mime_turu IN ('image/jpeg', 'image/png', 'image/webp')
    ),
    CONSTRAINT hane_mesaj_resimleri_uzanti_kontrol CHECK (uzanti IN ('jpg', 'png', 'webp')),
    CONSTRAINT hane_mesaj_resimleri_tarama_kontrol CHECK (
        tarama_durumu IN ('bekliyor', 'temiz', 'reddedildi')
    ),
    CONSTRAINT hane_mesaj_resimleri_boyut_kontrol CHECK (
        boyut_bayt > 0 AND boyut_bayt <= 10485760
    ),
    CONSTRAINT hane_mesaj_resimleri_olcu_kontrol CHECK (
        genislik > 0 AND yukseklik > 0 AND genislik <= 12000 AND yukseklik <= 12000
    ),
    CONSTRAINT hane_mesaj_resimleri_gecici_kontrol CHECK (
        (gecici_mi AND hane_mesaji_id IS NULL AND mesaja_baglanma_tarihi IS NULL)
        OR (NOT gecici_mi AND hane_mesaji_id IS NOT NULL AND mesaja_baglanma_tarihi IS NOT NULL)
    )
);

CREATE INDEX IF NOT EXISTS hane_mesaj_resimleri_gecici_temizlik_idx
    ON hane_mesaj_resimleri (son_kullanma_tarihi)
    WHERE gecici_mi = true;
CREATE INDEX IF NOT EXISTS hane_mesaj_resimleri_hane_idx
    ON hane_mesaj_resimleri (hane_id, olusturulma_tarihi DESC);

COMMENT ON TABLE hane_mesajlari IS 'Bir hanenin üyeleri arasındaki tek ve otomatik mesaj akışı.';
COMMENT ON COLUMN hane_mesajlari.istemci_mesaj_uuid IS 'Tekrarlı istemci isteklerinde aynı mesajın yeniden oluşmasını engeller.';
COMMENT ON TABLE hane_mesaj_durumlari IS 'Hane üyesinin mesaj okuma ve bildirim tercih durumu.';
COMMENT ON TABLE hane_mesaj_resimleri IS 'Hane mesajlarında güvenli biçimde yeniden işlenen özel resimler.';

COMMIT;
