<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Carbon\Carbon;
use App\Models\Agency\Agency;
use App\Models\Agency\Marketplace;
use App\Models\Definition\City;
use App\Models\Tour\Tour;
use App\Models\Tour\TourDate;
use App\Models\TourDateMarketplacePrice;
use App\Models\Product\Product;
use App\Models\Product\ProductType;

/**
 * Kültür turu örnek verisi — YENİ fiyat yapısına göre:
 *  - Fiyatlar tarih başına "pazaryeri × sınıf" matrisinde (tour_date_marketplace_prices).
 *  - Ürünün ANA PAZARI (products.primary_marketplace_id) tanımlanır; tarih satırındaki
 *    temsili adult_price/single_supplement… kolonları ana pazarın taban fiyatlarının kopyasıdır
 *    (liste/satış ekranları tekil fiyat bekler — applyPrimaryToDate ile aynı mantık).
 *  - Çocuk/bebek yaş aralıkları tur seviyesinde (genel ayar) tutulur; tarihler bunları devralır.
 */
class TourSeeder extends Seeder
{
     public function run(): void
     {
          $agency = Agency::first();
          if (!$agency)
               return;

          $productType = ProductType::where('code', 'kultur-turu')
               ->orWhere('slug', 'kultur-turu')
               ->first();

          if (!$productType)
               return;

          $istanbul = City::where('city', 'like', '%stanbul%')->first() ?? City::first();

          // ── Ana pazar: acentenin baz para birimli pazaryeri (yoksa oluştur) ──
          $currencies = $agency->getActiveCurrencies();
          $baseCurrency = $currencies->firstWhere('is_base', true) ?? $currencies->first();

          $marketplace = Marketplace::firstOrCreate(
               ['agency_id' => $agency->id, 'slug' => 'turkiye'],
               [
                    'name' => 'Türkiye',
                    'default_currency_id' => $baseCurrency?->id,
                    'is_active' => true,
               ]
          );

          $toursData = [
               [
                    'code' => '1000',
                    'name' => 'Kapadokya Rüyası (3 Gün 2 Gece)',
                    'slug' => 'kapadokya-ruyasi-3-gun-2-gece',
                    'description' => '<p>Peri bacalarının kalbinde unutulmaz bir yolculuk.</p>',
                    'short_description' => '3 günlük konaklamalı Kapadokya kültür turu.',
                    'days' => 3,
                    'nights' => 2,
                    'max_participants' => 30,
                    'min_participants' => 10,
                    'departure_city_id' => $istanbul->id,
                    'arrival_city_id' => $istanbul->id,
                    'tour_type' => 'domestic',
                    'is_active' => true,
                    // Tur seviyesi yaş aralıkları (tarih formları bunları devralır)
                    'child_min_age' => 2,
                    'child_max_age' => 12,
                    'infant_min_age' => 0,
                    'infant_max_age' => 2,
                    // Ana pazar (matris) fiyatları — tarih başına yazılır
                    'prices' => [
                         'adult_price' => 4500.00,
                         'single_supplement' => 1200.00,
                         'extra_bed_price' => null,
                         'child_price_1' => 3150.00,
                         'child_price_2' => 2800.00,
                         'infant_price' => 0.00,
                    ],
               ]
          ];

          foreach ($toursData as $data) {
               $tour = Tour::updateOrCreate(
                    ['slug' => $data['slug']],
                    [
                         'agency_id' => $agency->id,
                         'code' => $data['code'],
                         'name' => $data['name'],
                         'slug' => $data['slug'],
                         'description' => $data['description'],
                         'short_description' => $data['short_description'],
                         'days' => $data['days'],
                         'nights' => $data['nights'],
                         'max_participants' => $data['max_participants'],
                         'min_participants' => $data['min_participants'],
                         'departure_city_id' => $data['departure_city_id'],
                         'arrival_city_id' => $data['arrival_city_id'],
                         'tour_type' => $data['tour_type'],
                         'is_active' => $data['is_active'],
                         'duration' => $data['days'],
                         'child_min_age' => $data['child_min_age'],
                         'child_max_age' => $data['child_max_age'],
                         'infant_min_age' => $data['infant_min_age'],
                         'infant_max_age' => $data['infant_max_age'],
                    ]
               );

               // Product kaydı — base_price ana pazarın yetişkin fiyatını yansıtır
               $product = Product::updateOrCreate(
                    ['productable_type' => Tour::class, 'productable_id' => $tour->id],
                    [
                         'agency_id' => $agency->id,
                         'product_type_id' => $productType->id,
                         'primary_marketplace_id' => $marketplace->id,
                         'code' => $data['code'],
                         'name' => $data['name'],
                         'slug' => Product::generateUniqueSlug($data['name']),
                         'description' => $data['description'],
                         'base_price' => $data['prices']['adult_price'],
                         'currency' => $baseCurrency->code ?? 'TRY',
                         'is_active' => true,
                         'is_bookable' => true
                    ]
               );

               $tour->update(['product_id' => $product->id]);

               // Ürünü ana pazara bağla
               $product->marketplaces()->syncWithoutDetaching([$marketplace->id]);

               // ── Tarihler: önce eski tarihleri ve pazaryeri fiyat satırlarını temizle ──
               $oldDateIds = TourDate::where('cultural_tour_id', $tour->id)->pluck('id');
               if ($oldDateIds->isNotEmpty()) {
                    TourDateMarketplacePrice::where('priceable_type', (new TourDate)->getMorphClass())
                         ->whereIn('priceable_id', $oldDateIds)
                         ->delete();
               }
               TourDate::where('cultural_tour_id', $tour->id)->forceDelete();

               $p = $data['prices'];
               $currentDate = Carbon::now()->addDays(5);
               for ($i = 0; $i < 3; $i++) {
                    // Fiyat kolonları tarih tablosundan kaldırıldı — fiyatlar YALNIZCA
                    // pazaryeri matrisine (tour_date_marketplace_prices) yazılır.
                    $tourDate = TourDate::create([
                         'cultural_tour_id' => $tour->id,
                         'start_date' => $currentDate->copy()->addDays($i * 14)->format('Y-m-d'),
                         'end_date' => $currentDate->copy()->addDays($i * 14 + 2)->format('Y-m-d'),
                         'room_capacity' => 3,
                         // Yaş aralıkları turun genel ayarından devralınır
                         'child_min_age' => $data['child_min_age'],
                         'child_max_age' => $data['child_max_age'],
                         'infant_min_age' => $data['infant_min_age'],
                         'infant_max_age' => $data['infant_max_age'],
                         'currency' => $baseCurrency->code ?? 'TRY',
                         'exchange_rate' => $baseCurrency->exchange_rate ?? 1,
                         'remaining_capacity' => $data['max_participants'],
                         'total_capacity' => $data['max_participants'],
                         'min_participants' => $data['min_participants'],
                         'auto_confirm' => true,
                         'status' => 'booking_open',
                         'is_active' => true,
                         'is_bookable' => true,
                         'is_published' => true,
                         'is_confirmed' => true,
                         'guarantee_departure' => true
                    ]);

                    // Pazaryeri fiyat matrisi satırı (ana pazar, sınıfsız)
                    $tourDate->marketplacePrices()->create([
                         'marketplace_id' => $marketplace->id,
                         'tour_class_id' => null,
                         'currency' => $baseCurrency->code ?? 'TRY',
                         'exchange_rate' => $baseCurrency->exchange_rate ?? 1,
                         'adult_price' => $p['adult_price'],
                         'single_supplement' => $p['single_supplement'],
                         'extra_bed_price' => $p['extra_bed_price'],
                         'child_price_1' => $p['child_price_1'],
                         'child_price_2' => $p['child_price_2'],
                         'infant_price' => $p['infant_price'],
                    ]);
               }
          }
          $this->command->info('Kültür turları (ana pazar + pazaryeri fiyat matrisi ile) başarıyla eklendi!');
     }
}
