<?php

namespace Database\Seeders;

use App\Models\Agency\Agency;
use App\Models\Definition\Definition;
use App\Models\Definition\DefinitionAttribute;
use App\Models\Definition\DefinitionType;
use Illuminate\Database\Seeder;

/**
 * Acente için hazır tanım kayıtları (definitions).
 *
 * DefinitionTypesSeeder yalnızca tip/attribute iskeletini kurar; bu seeder o tiplere
 * gerçek içerik doldurur. Tur formlarındaki ve quick-view'daki "hazır tanım seçici"
 * dropdown'ları bu kayıtlardan beslenir.
 *
 * Not: seçici, önce `description` alanına bakar, boşsa `getValue('content')`
 * fallback'ine düşer — bu yüzden HTML içerik her iki yere de yazılır.
 */
class DefinitionSeeder extends Seeder
{
    public function run(): void
    {
        $agency = Agency::first();

        if (!$agency) {
            $this->command->warn('Acente bulunamadı. Lütfen önce AgencySeeder çalıştırın.');
            return;
        }

        $types = DefinitionType::whereIn('name', [
            'cancellation_policy',
            'tour_inclusions',
            'tour_exclusions',
            'terms_conditions',
            'tour_highlights',
            'attraction',
        ])->get()->keyBy('name');

        if ($types->isEmpty()) {
            $this->command->warn('Tanım tipleri bulunamadı. Lütfen önce DefinitionTypesSeeder çalıştırın.');
            return;
        }

        // 'content' attribute'u tanımlı tiplerin id'leri (inclusions/exclusions/terms/highlights).
        $contentTypeIds = DefinitionAttribute::where('name', 'content')
            ->whereIn('definition_type_id', $types->pluck('id'))
            ->pluck('definition_type_id')
            ->all();

        $count = 0;

        foreach ($this->definitions() as $typeName => $items) {
            $type = $types->get($typeName);

            if (!$type) {
                $this->command->warn("Tanım tipi bulunamadı, atlanıyor: {$typeName}");
                continue;
            }

            foreach ($items as $sort => $item) {
                // definitions tablosunda unique index yok; doğal anahtar agency + tip + ad.
                $definition = Definition::updateOrCreate(
                    [
                        'agency_id' => $agency->id,
                        'definition_type_id' => $type->id,
                        'name' => $item['name'],
                    ],
                    [
                        'description' => $item['content'] ?? null,
                        'is_active' => true,
                        'is_featured' => $item['is_featured'] ?? false,
                        'sort_order' => $sort + 1,
                    ]
                );

                $values = $item['values'] ?? [];

                // İçerik tipli tanımlarda (inclusions/exclusions/terms/highlights) content attribute'u
                // description ile aynı HTML'i tutar — seçicinin getValue('content') fallback'i için.
                if (isset($item['content']) && !isset($values['content']) && in_array($type->id, $contentTypeIds)) {
                    $values['content'] = $item['content'];
                }

                foreach ($values as $attribute => $value) {
                    $definition->setValue($attribute, $value);
                }

                $count++;
            }
        }

        $this->command->info("{$count} adet hazır tanım '{$agency->name}' acentesi için eklendi.");
    }

    /**
     * Tip adına göre tanım kayıtları.
     *
     * `content` → definitions.description (ve varsa `values.content` attribute'u).
     * `values`  → definition_values kayıtları (attribute adı => değer).
     */
    private function definitions(): array
    {
        return [
            'cancellation_policy' => [
                [
                    'name' => 'Esnek İptal (48 saat öncesine kadar ücretsiz)',
                    'is_featured' => true,
                    'content' => '<ul>'
                        . '<li>Hareket saatine <strong>48 saat</strong> kalana kadar yapılan iptallerde ücret alınmaz, ödemenin tamamı iade edilir.</li>'
                        . '<li>48 saatten sonra yapılan iptallerde tur bedelinin <strong>%50</strong>\'si tahsil edilir.</li>'
                        . '<li>Tura katılmayan (no-show) misafirlerden tur bedelinin <strong>%100</strong>\'ü tahsil edilir.</li>'
                        . '<li>İade işlemleri, iptal talebinin onaylanmasından itibaren <strong>7 iş günü</strong> içinde tamamlanır.</li>'
                        . '</ul>',
                    'values' => [
                        'policy_type' => 'flexible',
                        'free_cancellation_hours' => '48',
                        'cancellation_fee_percentage' => '50',
                        'no_show_fee_percentage' => '100',
                        'refund_processing_days' => '7',
                        'terms_and_conditions' => 'Hareket saatine 48 saat kalana kadar ücretsiz iptal. Sonrasında %50 iptal ücreti uygulanır.',
                    ],
                ],
                [
                    'name' => 'Orta Düzey İptal (7 gün öncesine kadar ücretsiz)',
                    'content' => '<ul>'
                        . '<li>Hareket tarihine <strong>7 gün</strong> kalana kadar yapılan iptallerde ücret alınmaz.</li>'
                        . '<li>7 gün ile 48 saat arasındaki iptallerde tur bedelinin <strong>%30</strong>\'u tahsil edilir.</li>'
                        . '<li>Son 48 saat içindeki iptallerde tur bedelinin <strong>%75</strong>\'i tahsil edilir.</li>'
                        . '<li>Tura katılmayan misafirlerden tur bedelinin <strong>%100</strong>\'ü tahsil edilir.</li>'
                        . '<li>İade işlemleri <strong>10 iş günü</strong> içinde tamamlanır.</li>'
                        . '</ul>',
                    'values' => [
                        'policy_type' => 'moderate',
                        'free_cancellation_hours' => '168',
                        'cancellation_fee_percentage' => '30',
                        'no_show_fee_percentage' => '100',
                        'refund_processing_days' => '10',
                        'terms_and_conditions' => 'Hareket tarihine 7 gün kalana kadar ücretsiz iptal. Sonrasında kademeli iptal ücreti uygulanır.',
                    ],
                ],
                [
                    'name' => 'Katı İptal (30 gün öncesine kadar ücretsiz)',
                    'content' => '<ul>'
                        . '<li>Hareket tarihine <strong>30 gün</strong> kalana kadar yapılan iptallerde ücret alınmaz.</li>'
                        . '<li>30 gün ile 15 gün arasındaki iptallerde tur bedelinin <strong>%50</strong>\'si tahsil edilir.</li>'
                        . '<li>Son 15 gün içindeki iptallerde <strong>iade yapılmaz</strong>.</li>'
                        . '<li>Uçak bileti, vize ve otel gibi kesinleşmiş masraflar her koşulda iade dışıdır.</li>'
                        . '<li>İade işlemleri <strong>14 iş günü</strong> içinde tamamlanır.</li>'
                        . '</ul>',
                    'values' => [
                        'policy_type' => 'strict',
                        'free_cancellation_hours' => '720',
                        'cancellation_fee_percentage' => '50',
                        'no_show_fee_percentage' => '100',
                        'refund_processing_days' => '14',
                        'terms_and_conditions' => 'Hareket tarihine 30 gün kalana kadar ücretsiz iptal. Son 15 gün içinde iade yapılmaz.',
                        'special_conditions' => 'Uçak bileti, vize ve otel gibi kesinleşmiş masraflar iade kapsamı dışındadır.',
                    ],
                ],
                [
                    'name' => 'İade Edilemez (Promosyonlu Fiyat)',
                    'content' => '<ul>'
                        . '<li>Bu tarife <strong>iade edilemez</strong>; iptal durumunda geri ödeme yapılmaz.</li>'
                        . '<li>Katılımcı değişikliği hareket tarihine 7 gün kalana kadar ücretsiz yapılabilir.</li>'
                        . '<li>Turun acente tarafından iptal edilmesi hâlinde ödemenin tamamı iade edilir.</li>'
                        . '</ul>',
                    'values' => [
                        'policy_type' => 'custom',
                        'free_cancellation_hours' => '0',
                        'cancellation_fee_percentage' => '100',
                        'no_show_fee_percentage' => '100',
                        'terms_and_conditions' => 'Promosyonlu fiyat: iptal durumunda iade yapılmaz. Katılımcı değişikliği 7 gün öncesine kadar ücretsizdir.',
                        'special_conditions' => 'Turun acente tarafından iptali hâlinde tam iade uygulanır.',
                    ],
                ],
            ],

            'tour_inclusions' => [
                [
                    'name' => 'Standart Kültür Turu — Fiyata Dahil',
                    'is_featured' => true,
                    'content' => '<ul>'
                        . '<li>Otobüs/minibüs ile ulaşım</li>'
                        . '<li>Belirtilen otelde oda-kahvaltı konaklama</li>'
                        . '<li>Profesyonel rehberlik hizmeti</li>'
                        . '<li>Programda belirtilen müze ve ören yeri girişleri</li>'
                        . '<li>Zorunlu seyahat sigortası</li>'
                        . '<li>Araç içi ikramlar</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Günübirlik Tur — Fiyata Dahil',
                    'content' => '<ul>'
                        . '<li>Gidiş-dönüş ulaşım</li>'
                        . '<li>Profesyonel rehberlik hizmeti</li>'
                        . '<li>Programda belirtilen giriş ücretleri</li>'
                        . '<li>Zorunlu seyahat sigortası</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Yurt Dışı Turu — Fiyata Dahil',
                    'content' => '<ul>'
                        . '<li>Gidiş-dönüş ekonomi sınıfı uçak bileti</li>'
                        . '<li>Havalimanı vergileri ve harçlar</li>'
                        . '<li>Belirtilen otelde oda-kahvaltı konaklama</li>'
                        . '<li>Havalimanı-otel-havalimanı transferleri</li>'
                        . '<li>Türkçe profesyonel rehberlik hizmeti</li>'
                        . '<li>Programda belirtilen tüm şehir turları ve müze girişleri</li>'
                        . '<li>Zorunlu seyahat sigortası</li>'
                        . '</ul>',
                ],
            ],

            'tour_exclusions' => [
                [
                    'name' => 'Standart Kültür Turu — Fiyata Dahil Değil',
                    'is_featured' => true,
                    'content' => '<ul>'
                        . '<li>Öğle ve akşam yemekleri</li>'
                        . '<li>Kişisel harcamalar</li>'
                        . '<li>Programda belirtilmeyen ekstra turlar ve müze girişleri</li>'
                        . '<li>Tek kişilik oda farkı</li>'
                        . '<li>Rehber ve şoför bahşişleri</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Günübirlik Tur — Fiyata Dahil Değil',
                    'content' => '<ul>'
                        . '<li>Yemek ve içecekler</li>'
                        . '<li>Kişisel harcamalar</li>'
                        . '<li>Programda belirtilmeyen ekstra aktiviteler</li>'
                        . '<li>Rehber ve şoför bahşişleri</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Yurt Dışı Turu — Fiyata Dahil Değil',
                    'content' => '<ul>'
                        . '<li>Vize ücreti ve vize işlem bedeli</li>'
                        . '<li>Yurt dışı çıkış harcı</li>'
                        . '<li>Öğle ve akşam yemekleri</li>'
                        . '<li>Kişisel harcamalar ve ekstra turlar</li>'
                        . '<li>Tek kişilik oda farkı</li>'
                        . '<li>Fazla bagaj ücretleri</li>'
                        . '<li>Rehber ve şoför bahşişleri</li>'
                        . '</ul>',
                ],
            ],

            'terms_conditions' => [
                [
                    'name' => 'Genel Katılım Şartları',
                    'is_featured' => true,
                    'content' => '<ul>'
                        . '<li>Tur programındaki saatlere uyulması zorunludur; buluşma noktasında hazır bulunmayan misafirler turdan yararlanamaz ve iade hakkı doğmaz.</li>'
                        . '<li>Acente, hava koşulları ve mücbir sebepler nedeniyle program sırasını değiştirme hakkını saklı tutar.</li>'
                        . '<li>Minimum katılımcı sayısına ulaşılmaması hâlinde tur iptal edilebilir; bu durumda ödemenin tamamı iade edilir.</li>'
                        . '<li>Tur sırasında geçerli kimlik belgesi bulundurulması zorunludur.</li>'
                        . '<li>Rezervasyon onayı, ödemenin acenteye ulaşması ile kesinleşir.</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Yurt Dışı Turu Şartları',
                    'content' => '<ul>'
                        . '<li>Pasaportun dönüş tarihinden itibaren en az <strong>6 ay</strong> geçerli olması zorunludur.</li>'
                        . '<li>Vize başvurusunun olumsuz sonuçlanması durumunda iptal koşulları uygulanır; vize ücreti iade edilmez.</li>'
                        . '<li>Uçuş saatleri havayolu tarafından değiştirilebilir; program buna göre güncellenebilir.</li>'
                        . '<li>Yurt dışı çıkış yasağı bulunan misafirler tura katılamaz; bu durumda iade yapılmaz.</li>'
                        . '<li>18 yaş altı katılımcılar için veli muvafakatnamesi gereklidir.</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Ödeme ve Rezervasyon Koşulları',
                    'content' => '<ul>'
                        . '<li>Rezervasyon sırasında tur bedelinin <strong>%35</strong>\'i kapora olarak tahsil edilir.</li>'
                        . '<li>Kalan tutarın hareket tarihinden <strong>15 gün</strong> önce ödenmesi gerekir.</li>'
                        . '<li>Süresi içinde tamamlanmayan ödemelerde rezervasyon iptal edilir ve kapora iade edilmez.</li>'
                        . '<li>Fiyatlar, kontenjan ve döviz kuru değişimlerine bağlı olarak güncellenebilir; onaylanmış rezervasyonlar bu değişimden etkilenmez.</li>'
                        . '</ul>',
                ],
            ],

            'tour_highlights' => [
                [
                    'name' => 'Kültür Turu — Öne Çıkanlar',
                    'is_featured' => true,
                    'content' => '<ul>'
                        . '<li>UNESCO Dünya Mirası listesindeki noktalara ziyaret</li>'
                        . '<li>Alanında uzman Türkçe rehber eşliğinde gezi</li>'
                        . '<li>Merkezi konumda seçkin otellerde konaklama</li>'
                        . '<li>Küçük gruplarla kişiselleştirilmiş deneyim</li>'
                        . '<li>Yerel lezzetleri tatma fırsatı</li>'
                        . '</ul>',
                ],
                [
                    'name' => 'Günübirlik Tur — Öne Çıkanlar',
                    'content' => '<ul>'
                        . '<li>Tek günde dolu dolu program</li>'
                        . '<li>Konforlu araçlarla ulaşım</li>'
                        . '<li>Fotoğraf molaları için ayrılmış zaman</li>'
                        . '<li>Merkezi buluşma noktası</li>'
                        . '</ul>',
                ],
            ],

            'attraction' => [
                [
                    'name' => 'Ayasofya Camii',
                    'is_featured' => true,
                    'content' => 'Bizans ve Osmanlı mimarisinin simgesi; 1500 yılı aşkın tarihiyle İstanbul\'un en çok ziyaret edilen yapısı.',
                    'values' => [
                        'category' => 'dini',
                        'city' => 'İstanbul',
                        'district' => 'Fatih',
                        'address' => 'Sultan Ahmet Mah., Ayasofya Meydanı No:1, Fatih/İstanbul',
                        'visiting_hours' => '09:00 - 18:00 (namaz saatleri hariç)',
                        'entrance_fee' => '0',
                        'visit_duration' => '60',
                        'difficulty_level' => 'kolay',
                        'has_guide' => '1',
                        'is_wheelchair_accessible' => '1',
                        'best_season' => 'tum_yil',
                    ],
                ],
                [
                    'name' => 'Topkapı Sarayı',
                    'content' => 'Osmanlı padişahlarının 400 yıl boyunca yönetim merkezi olarak kullandığı saray kompleksi ve müzesi.',
                    'values' => [
                        'category' => 'tarih',
                        'city' => 'İstanbul',
                        'district' => 'Fatih',
                        'address' => 'Cankurtaran Mah., Topkapı Sarayı, Fatih/İstanbul',
                        'visiting_hours' => '09:00 - 18:00 (Salı kapalı)',
                        'entrance_fee' => '1500',
                        'visit_duration' => '150',
                        'difficulty_level' => 'orta',
                        'has_guide' => '1',
                        'is_wheelchair_accessible' => '0',
                        'best_season' => 'ilkbahar',
                    ],
                ],
                [
                    'name' => 'Efes Antik Kenti',
                    'content' => 'Antik dünyanın en iyi korunmuş kentlerinden biri; Celsus Kütüphanesi ve Büyük Tiyatro ile ünlü.',
                    'values' => [
                        'category' => 'tarih',
                        'city' => 'İzmir',
                        'district' => 'Selçuk',
                        'address' => 'Atatürk Mah., Uğur Mumcu Sk., Selçuk/İzmir',
                        'visiting_hours' => '08:00 - 19:00',
                        'entrance_fee' => '1300',
                        'visit_duration' => '180',
                        'difficulty_level' => 'orta',
                        'has_guide' => '1',
                        'is_wheelchair_accessible' => '0',
                        'best_season' => 'ilkbahar',
                    ],
                ],
                [
                    'name' => 'Pamukkale Travertenleri',
                    'content' => 'Beyaz kalsiyum terasları ve Hierapolis antik kentiyle UNESCO Dünya Mirası alanı.',
                    'values' => [
                        'category' => 'doga',
                        'city' => 'Denizli',
                        'district' => 'Pamukkale',
                        'address' => 'Pamukkale Mah., Pamukkale/Denizli',
                        'visiting_hours' => '06:30 - 21:00',
                        'entrance_fee' => '1100',
                        'visit_duration' => '180',
                        'difficulty_level' => 'orta',
                        'has_guide' => '1',
                        'is_wheelchair_accessible' => '0',
                        'best_season' => 'sonbahar',
                    ],
                ],
                [
                    'name' => 'Göreme Açık Hava Müzesi',
                    'content' => 'Kapadokya\'nın kaya kiliseleri ve fresklerinin bulunduğu açık hava müzesi.',
                    'values' => [
                        'category' => 'tarih',
                        'city' => 'Nevşehir',
                        'district' => 'Göreme',
                        'address' => 'Müze Cad., Göreme/Nevşehir',
                        'visiting_hours' => '08:00 - 17:00',
                        'entrance_fee' => '1400',
                        'visit_duration' => '120',
                        'difficulty_level' => 'orta',
                        'has_guide' => '1',
                        'is_wheelchair_accessible' => '0',
                        'best_season' => 'ilkbahar',
                    ],
                ],
                [
                    'name' => 'Anıtkabir',
                    'content' => 'Mustafa Kemal Atatürk\'ün anıt mezarı ve Kurtuluş Savaşı Müzesi.',
                    'values' => [
                        'category' => 'tarih',
                        'city' => 'Ankara',
                        'district' => 'Çankaya',
                        'address' => 'Mebusevleri Mah., Anıt Cad., Çankaya/Ankara',
                        'visiting_hours' => '09:00 - 17:00',
                        'entrance_fee' => '0',
                        'visit_duration' => '90',
                        'difficulty_level' => 'kolay',
                        'has_guide' => '0',
                        'is_wheelchair_accessible' => '1',
                        'best_season' => 'tum_yil',
                    ],
                ],
            ],
        ];
    }
}
