<?php

namespace App\Models\Agency;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class AgencyContract extends Model
{
    use HasFactory;

    protected $table = 'agency_contracts';

    protected $fillable = [
        'agency_id',
        'title',
        'slug',
        'context',
        'content',
        'merge_fields',
        'logo',
        'is_active',
        'is_system'
    ];

    protected $casts = [
        'is_active' => 'boolean',
        'is_system' => 'boolean',
        'merge_fields' => 'array',
    ];

    /** Bağlam seçenekleri (kontrat kimin için). */
    public const CONTEXTS = [
        'general' => 'Genel',
        'customer' => 'Müşteri',
        'guide' => 'Rehber',
        'vehicle' => 'Araç',
        'captain' => 'Kaptan',
        'passenger' => 'Yolcu',
    ];

    /** Yolcu manifestosundan üretilebilen belge bağlamları. */
    public const PASSENGER_CONTEXTS = ['passenger', 'general'];

    /** Kaynak (atama) sözleşmesi bağlamları. */
    public const RESOURCE_CONTEXTS = ['guide', 'vehicle', 'captain'];

    public function agency()
    {
        return $this->belongsTo(Agency::class);
    }

    public function translations()
    {
        return $this->hasMany(AgencyContractTranslation::class, 'agency_contract_id');
    }

    /** Bu şablondan üretilmiş kontrat örnekleri. */
    public function resourceContracts()
    {
        return $this->hasMany(\App\Models\Operation\ResourceContract::class, 'template_id');
    }

    /** Bağlama göre filtre (guide şablonları operasyonda listelenir). */
    public function scopeContext($query, $context)
    {
        return $query->where('context', $context);
    }

    /** Rehber atamalarında kullanılabilir şablonlar (guide + general). Geriye uyum. */
    public function scopeForGuide($query)
    {
        return $query->whereIn('context', ['guide', 'general']);
    }

    /** Bir kaynak rolüne (guide/vehicle/captain) uygun şablonlar (o rol + general). */
    public function scopeForResourceRole($query, ?string $role)
    {
        $ctx = in_array($role, self::RESOURCE_CONTEXTS, true) ? $role : 'guide';

        return $query->whereIn('context', [$ctx, 'general']);
    }

    /**
     * Belirli bir dile ait çeviriyi döndürür.
     */
    public function translationFor($languageId): ?AgencyContractTranslation
    {
        return $this->translations->firstWhere('language_id', (int) $languageId);
    }

    /**
     * Seeds the default legal contracts for a given agency.
     */
    public static function seedDefaultsForAgency($agency)
    {
        $defaultContracts = [
            [
                'title' => 'Mesafeli Satış Sözleşmesi',
                'slug' => 'mesafeli-satis-sozlesmesi',
                'content' => '<h3>1. TARAFLAR</h3><p>İşbu Sözleşme aşağıdaki taraflar arasında aşağıda belirtilen hüküm ve şartlar çerçevesinde imzalanmıştır.</p><p><strong>A. ALICI:</strong> (Sistemden dinamik olarak çekilecektir)</p><p><strong>B. SATICI (ACENTE):</strong> ' . $agency->name . '</p><h3>2. KONU</h3><p>İşbu Sözleşmenin konusu, ALICI’nın SATICI’ya ait internet sitesi üzerinden elektronik ortamda siparişini verdiği aşağıda nitelikleri ve satış fiyatı belirtilen ürün/hizmetin satışı ve teslimi ile ilgili olarak 6502 sayılı Tüketicinin Korunması Hakkında Kanun ve Mesafeli Sözleşmeler Yönetmeliği hükümleri gereğince tarafların hak ve yükümlülüklerinin saptanmasıdır.</p><h3>3. İPTAL VE İADE KOŞULLARI</h3><p>Tüketici, tur veya hizmet başlangıç tarihinden en az 30 gün önce iptal talebinde bulunduğunda ödediği bedelin tamamı kendisine iade edilir. Kalan sürelerdeki iptallerde acente sözleşmesindeki kesintiler uygulanır.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Kullanım Koşulları',
                'slug' => 'kullanim-kosullari',
                'content' => '<h3>1. GİRİŞ</h3><p>Bu internet sitesine girerek veya bu internet sitesindeki herhangi bir bilgiyi kullanarak, aşağıdaki koşulları kabul etmiş sayılmaktasınız.</p><h3>2. FİKRİ MÜLKİYET HAKLARI</h3><p>Bu site ve sitedeki tüm içerik, grafikler, tasarımlar, logolar ' . $agency->name . ' mülkiyetindedir ve telif hakkı koruması altındadır. İzinsiz kopyalanamaz ve ticari amaçla kullanılamaz.</p><h3>3. SORUMLULUK SINIRLANDIRILMASI</h3><p>Acente, bu sitede yer alan bilgilerin doğruluğunu sağlamak için makul gayret göstermektedir ancak sitedeki yazım hatalarından, gecikmelerden veya eksikliklerden sorumlu tutulamaz.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Çerez Politikası',
                'slug' => 'cerez-politikasi',
                'content' => '<h3>ÇEREZ (COOKIE) POLİTİKASI</h3><p>İşbu Çerez Politikası; ' . $agency->name . ' olarak ziyaretçilerimizin gizliliğini korumak ve internet sitemizi daha verimli kullanmalarını sağlamak amacıyla hazırlanmıştır.</p><h3>1. Çerez Nedir?</h3><p>Çerezler, ziyaret ettiğiniz internet siteleri tarafından tarayıcınız aracılığıyla cihazınıza kaydedilen küçük metin dosyalarıdır. Sitenin düzgün çalışması, kullanıcı deneyiminin geliştirilmesi ve istatistiksel verilerin analizi için kullanılır.</p><h3>2. Kullanılan Çerez Türleri</h3><ul><li><strong>Zorunlu Çerezler:</strong> Sitenin temel işlevlerini yerine getirebilmesi için gerekli olan çerezlerdir.</li><li><strong>Performans Çerezleri:</strong> Sitenin nasıl kullanıldığını analiz etmemize yardımcı olan anonim çerezlerdir.</li><li><strong>İşlevsel Çerezler:</strong> Dil, bölge gibi seçimlerinizi hatırlayarak size kişiselleştirilmiş bir deneyim sunan çerezlerdir.</li></ul>',
                'is_system' => true,
            ],
            [
                'title' => 'Gizlilik Politikası',
                'slug' => 'gizlilik-politikasi',
                'content' => '<h3>GİZLİLİK POLİTİKASI VE KVKK AYDINLATMA METNİ</h3><p>Bu Gizlilik Politikası, ' . $agency->name . ' tarafından işletilen internet sitemiz üzerinden toplanan kişisel verilerin işlenmesine ilişkin kuralları belirler.</p><h3>1. Toplanan Veriler</h3><p>Müşteri kaydı, tur rezervasyonu veya iletişim formları doldurulduğunda ad, soyad, e-posta adresi, telefon numarası ve pasaport bilgileri gibi gerekli veriler toplanmaktadır.</p><h3>2. Verilerin İşlenme Amaçları</h3><p>Toplanan kişisel verileriniz, rezervasyon işlemlerinizin gerçekleştirilmesi, bilgilendirme mesajlarının gönderilmesi ve yasal yükümlülüklerin yerine getirilmesi amacıyla işlenmektedir.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Paket Tur Sözleşmesi',
                'slug' => 'paket-tur-sozlesmesi',
                'content' => '<h3>PAKET TUR SÖZLEŞMESİ</h3><p>İşbu sözleşme, Paket Tur Sözleşmeleri Yönetmeliği hükümleri çerçevesinde düzenlenmiş olup, tarafların hak ve yükümlülüklerini belirler.</p><h3>1. SÖZLEŞME BEDELİ VE ÖDEMELER</h3><p>Paket tur bedeline dahil olan ve olmayan tüm hizmetler rezervasyon formunda açıkça belirtilmiştir. Fiyat değişiklikleri yasal sınırlar dahilinde ve tur başlangıcından en az 20 gün önce bildirilmek koşuluyla yapılabilir.</p><h3>2. MÜCBİR SEBEPLER</h3><p>Doğal afetler, savaş, salgın hastalık, grev, lokavt gibi acentenin kontrolü dışındaki olağanüstü durumlar mücbir sebep olarak kabul edilir ve tarafların sorumluluklarını askıya alır.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'KVKK Aydınlatma ve Açık Rıza Metni',
                'slug' => 'kvkk-aydinlatma-ve-acik-riza-metni',
                'content' => '<h3>KVKK AYDINLATMA VE AÇIK RIZA METNİ</h3><p>6698 sayılı Kişisel Verilerin Korunması Kanunu ("KVKK") uyarınca, ' . $agency->name . ' olarak veri sorumlusu sıfatıyla kişisel verilerinizi işliyoruz.</p><h3>1. KİŞİSEL VERİLERİNİZİN İŞLENME AMAÇLARI</h3><p>Kişisel verileriniz, seyahat hizmetlerinin planlanması, vize başvurularının takibi, otel ve uçak rezervasyonlarının yapılması gibi ticari faaliyetlerimizin yürütülmesi amacıyla işlenir.</p><h3>2. AÇIK RIZA BEYANI</h3><p>İnternet sitemiz üzerinden paylaştığım kişisel verilerimin, yukarıda belirtilen amaçlar doğrultusunda işlenmesini ve yurt içi/yurt dışı iş ortaklarına aktarılmasını kabul ediyorum.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Ticari Elektronik İleti Onay Metni',
                'slug' => 'ticari-elektronik-ileti-onay-metni',
                'content' => '<h3>TİCARİ ELEKTRONİK İLETİ ONAY METNİ</h3><p>İşbu onay metni ile, 6563 sayılı Elektronik Ticaretin Düzenlenmesi Hakkında Kanun uyarınca ' . $agency->name . ' tarafından sunulan ürün, hizmet, indirim ve kampanyalara ilişkin ticari iletilerin tarafıma gönderilmesine onay veriyorum.</p><p>Kullanıcılar diledikleri zaman bu iletileri almaktan vazgeçme ve onaylarını geri çekme hakkına sahiptir.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Üyelik Sözleşmesi',
                'slug' => 'uyelik-sozlesmesi',
                'content' => '<h3>ÜYELİK SÖZLEŞMESİ</h3><p>İşbu Üyelik Sözleşmesi, ' . $agency->name . ' internet sitesine üye olan kullanıcılar ile site yönetimi arasında akdedilmiştir.</p><h3>1. ÜYELİK ŞARTLARI</h3><p>Üye, kayıt formunda belirttiği bilgilerin doğru olduğunu ve şifresinin gizliliğinden kendisinin sorumlu olduğunu kabul eder.</p><h3>2. ÜYENİN HAK VE YÜKÜMLÜLÜKLERİ</h3><p>Üye, sistemi yasalara aykırı amaçlarla kullanamaz. Aksi takdirde üyeliği sonlandırılır ve doğacak tüm yasal sorumluluk üyeye aittir.</p>',
                'is_system' => true,
            ],
            [
                'title' => 'Rehber Hizmet Sözleşmesi',
                'slug' => 'rehber-hizmet-sozlesmesi',
                'context' => 'guide',
                'content' => '<h3>REHBER HİZMET SÖZLEŞMESİ</h3><p>İşbu sözleşme, bir tarafta <strong>{{acente.ad}}</strong> ("Acente") ile diğer tarafta <strong>{{rehber.ad_soyad}}</strong> ("Rehber") arasında aşağıdaki şartlarla akdedilmiştir.</p><h3>1. GÖREV KONUSU</h3><p>Rehber, <strong>{{tur.ad}}</strong> ({{tur.kod}}) turunda <strong>{{gorev.baslangic}}</strong> – <strong>{{gorev.bitis}}</strong> tarihleri arasında <strong>{{gorev.rol}}</strong> olarak hizmet vermeyi kabul eder.</p><h3>2. ÜCRET</h3><p>Bu görev için Rehbere ödenecek toplam hizmet bedeli <strong>{{ucret.tutar}} {{ucret.para_birimi}}</strong> ({{ucret.tur}}) olarak belirlenmiştir.</p><h3>3. YÜKÜMLÜLÜKLER</h3><p>Rehber; görevini özenle yerine getireceğini, katılımcıların güvenliğini gözeteceğini ve Acente\'nin talimatlarına uyacağını taahhüt eder.</p><h3>4. GENEL HÜKÜMLER</h3><p>İşbu sözleşme {{tarih.bugun}} tarihinde iki taraf arasında düzenlenmiştir. İletişim: {{acente.telefon}}</p>',
                'merge_fields' => \App\Services\Operation\ContractRenderService::defaultGuideMergeFields(),
                'is_system' => true,
            ],
            [
                'title' => 'Araç / Taşıma Hizmet Sözleşmesi',
                'slug' => 'arac-tasima-hizmet-sozlesmesi',
                'context' => 'vehicle',
                'content' => '<h3>ARAÇ / TAŞIMA HİZMET SÖZLEŞMESİ</h3><p>İşbu sözleşme, bir tarafta <strong>{{acente.ad}}</strong> ("Acente") ile diğer tarafta <strong>{{rehber.ad_soyad}}</strong> ("Taşıyıcı / Araç Sağlayıcı") arasında akdedilmiştir.</p><h3>1. HİZMET KONUSU</h3><p>Taşıyıcı, <strong>{{tur.ad}}</strong> ({{tur.kod}}) turunda <strong>{{gorev.baslangic}}</strong> – <strong>{{gorev.bitis}}</strong> tarihleri arasında <strong>{{gorev.rol}}</strong> olarak araç/taşıma hizmeti vermeyi kabul eder.</p><h3>2. ÜCRET</h3><p>Bu hizmet için ödenecek toplam bedel <strong>{{ucret.tutar}} {{ucret.para_birimi}}</strong> ({{ucret.tur}}) olarak belirlenmiştir.</p><h3>3. YÜKÜMLÜLÜKLER</h3><p>Taşıyıcı; aracın teknik ve yasal uygunluğunu, sürücünün ehliyet ve belgelerinin geçerliliğini ve yolcu güvenliğini sağlamayı taahhüt eder.</p><h3>4. GENEL HÜKÜMLER</h3><p>İşbu sözleşme {{tarih.bugun}} tarihinde düzenlenmiştir. İletişim: {{acente.telefon}}</p>',
                'merge_fields' => \App\Services\Operation\ContractRenderService::defaultGuideMergeFields(),
                'is_system' => true,
            ],
            [
                'title' => 'Kaptan / Şoför Hizmet Sözleşmesi',
                'slug' => 'kaptan-hizmet-sozlesmesi',
                'context' => 'captain',
                'content' => '<h3>KAPTAN / ŞOFÖR HİZMET SÖZLEŞMESİ</h3><p>İşbu sözleşme, bir tarafta <strong>{{acente.ad}}</strong> ("Acente") ile diğer tarafta <strong>{{rehber.ad_soyad}}</strong> ("Kaptan / Şoför") arasında akdedilmiştir.</p><h3>1. GÖREV KONUSU</h3><p>Kaptan/Şoför, <strong>{{tur.ad}}</strong> ({{tur.kod}}) turunda <strong>{{gorev.baslangic}}</strong> – <strong>{{gorev.bitis}}</strong> tarihleri arasında <strong>{{gorev.rol}}</strong> olarak hizmet vermeyi kabul eder.</p><h3>2. ÜCRET</h3><p>Bu görev için ödenecek toplam bedel <strong>{{ucret.tutar}} {{ucret.para_birimi}}</strong> ({{ucret.tur}}) olarak belirlenmiştir.</p><h3>3. YÜKÜMLÜLÜKLER</h3><p>Kaptan/Şoför; trafik kurallarına ve çalışma-dinlenme sürelerine uyacağını, yolcu güvenliğini gözeteceğini ve Acente talimatlarına uyacağını taahhüt eder.</p><h3>4. GENEL HÜKÜMLER</h3><p>İşbu sözleşme {{tarih.bugun}} tarihinde düzenlenmiştir. İletişim: {{acente.telefon}}</p>',
                'merge_fields' => \App\Services\Operation\ContractRenderService::defaultGuideMergeFields(),
                'is_system' => true,
            ],
            [
                'title' => 'Tur Katılım Voucher\'ı',
                'slug' => 'tur-katilim-voucher',
                'context' => 'passenger',
                'content' => '<h3>TUR KATILIM VOUCHER\'I</h3><p>İşbu voucher, <strong>{{yolcu.ad_soyad}}</strong> adlı yolcunun <strong>{{acente.ad}}</strong> tarafından düzenlenen <strong>{{tur.ad}}</strong> ({{tur.kod}}) turuna katılım hakkını belgeler.</p><table style="width:100%;border-collapse:collapse"><tr><td style="padding:6px 0"><strong>Yolcu:</strong> {{yolcu.ad_soyad}}</td><td><strong>Kimlik No:</strong> {{yolcu.kimlik}}</td></tr><tr><td style="padding:6px 0"><strong>Tur:</strong> {{tur.ad}} ({{tur.kod}})</td><td><strong>Hareket Tarihi:</strong> {{tarih.baslangic}}</td></tr></table><h3>ALINAN HİZMETLER</h3><p style="margin:0 0 4px;font-size:13px;color:#64748b">Aşağıdaki hizmetler rezervasyon kapsamına dahildir.</p>{{hizmet.tablo}}<h3>AÇIKLAMALAR</h3><p>Bu voucher tur başlangıcında yetkiliye ibraz edilmelidir. Voucher üzerindeki bilgilerin kimlik belgesi ile uyumlu olması gerekmektedir.</p><p style="margin-top:20px">Düzenleyen: {{acente.ad}} · {{acente.telefon}} · {{tarih.bugun}}</p>',
                'is_system' => true,
            ],
        ];

        foreach ($defaultContracts as $contractData) {
            self::updateOrCreate(
                [
                    'agency_id' => $agency->id,
                    'slug' => $contractData['slug'],
                ],
                [
                    'title' => $contractData['title'],
                    'content' => $contractData['content'],
                    'context' => $contractData['context'] ?? 'customer',
                    'merge_fields' => $contractData['merge_fields'] ?? null,
                    'is_system' => $contractData['is_system'],
                    'is_active' => true,
                ]
            );
        }
    }
}
