<?php

namespace App\Support;

/**
 * Konaklamalı tur (kültür + yurtdışı) fiyat tiplerinin TEK kaynağı.
 *
 * Neden burada: aynı fiyat tipleri hem ürün yönetiminde (tarih/pazaryeri fiyat
 * matrisi) hem satışta (katalog fiyat tipleri, odalama, kalem adları) görünüyor.
 * Etiketler daha önce üç ayrı yerde elle yazılıydı; biri değişince diğerleri
 * geride kalıyordu. Artık etiket/ipucu değişikliği yalnızca bu dosyada yapılır.
 *
 * TERİM NOTU (iş kuralı):
 * `adult_price` kolonu "yetişkin fiyatı" DEĞİLDİR. Sektör standardı olarak
 * ÇİFT KİŞİLİK ODADA KİŞİ BAŞI konaklama fiyatıdır — yani iki kişilik bir odayı
 * iki kişi paylaştığında kişi başına düşen tutar. Tek başına kalınırsa üstüne
 * `single_supplement` (tek kişilik oda farkı) eklenir; odaya ilave yatak
 * konursa o kişi `extra_bed_price` üzerinden fiyatlanır.
 * Kolon adı geriye dönük uyum için `adult_price` olarak KORUNUR; değişen
 * yalnızca kullanıcıya gösterilen etikettir.
 */
class TourFareCatalog
{
    /**
     * Fiyat tipleri. Sıra, arayüzde gösterim sırasıdır.
     *
     * key          iç anahtar (satış kartı JS'i ve oda hesabı bunu kullanır)
     * column       tour_date_marketplace_prices kolonu
     * label        uzun etiket — form alanı / açıklamalı yerler
     * short        dar sütun başlıkları ve rozetler için kısa etiket
     * hint         alanın altında/ipucunda gösterilecek açıklama (null olabilir)
     * icon         FontAwesome sınıfı
     * per          'person' = kişi başı çarpılır, 'supplement' = kişi başına eklenen fark
     */
    public const FARES = [
        'adult' => [
            'key' => 'adult',
            'column' => 'adult_price',
            'label' => 'Çift Kişilik Odada Kişi Başı',
            'short' => 'Kişi Başı (2 Kişilik Oda)',
            'hint' => 'İki kişilik odayı iki kişi paylaştığında kişi başına düşen fiyat.',
            'icon' => 'fa-user',
            'per' => 'person',
        ],
        'single' => [
            'key' => 'single',
            'column' => 'single_supplement',
            'label' => 'Tek Kişilik Oda Farkı',
            'short' => 'Tek Kişi Farkı',
            'hint' => 'Çift kişilik odada tek başına kalan kişiye kişi başı fiyatın ÜSTÜNE eklenir.',
            'icon' => 'fa-bed',
            'per' => 'supplement',
        ],
        'extra_bed' => [
            'key' => 'extra_bed',
            'column' => 'extra_bed_price',
            'label' => 'Ek Yatak',
            'short' => 'Ek Yatak',
            'hint' => 'Odaya ilave yatak konularak kalan kişinin fiyatı.',
            'icon' => 'fa-bed-pulse',
            'per' => 'person',
        ],
        'child1' => [
            'key' => 'child1',
            'column' => 'child_price_1',
            'label' => '1. Çocuk',
            'short' => '1. Çocuk',
            'hint' => 'İki yetişkin yanında kalan birinci çocuğun fiyatı.',
            'icon' => 'fa-child',
            'per' => 'person',
        ],
        'child2' => [
            'key' => 'child2',
            'column' => 'child_price_2',
            'label' => '2. Çocuk',
            'short' => '2. Çocuk',
            'hint' => 'Aynı odadaki ikinci çocuğun fiyatı.',
            'icon' => 'fa-child-reaching',
            'per' => 'person',
        ],
        'infant' => [
            'key' => 'infant',
            'column' => 'infant_price',
            'label' => 'Bebek',
            'short' => 'Bebek',
            'hint' => 'Yaş aralığı tur tarihinde tanımlanır; genelde yatak verilmez.',
            'icon' => 'fa-baby',
            'per' => 'person',
        ],
    ];

    /** Arayüzde gösterilecek tipler; bebek yalnızca tur bebek kabul ediyorsa listelenir. */
    public static function forTour(bool $infantAllowed = true): array
    {
        return array_values(array_filter(
            self::FARES,
            fn ($f) => $f['key'] !== 'infant' || $infantAllowed
        ));
    }

    /** Kolon adından fiyat tipi (eski kayıtları/URL'leri çözerken). */
    public static function byColumn(string $column): ?array
    {
        foreach (self::FARES as $fare) {
            if ($fare['column'] === $column) {
                return $fare;
            }
        }

        return null;
    }

    public static function label(string $key): string
    {
        return self::FARES[$key]['label'] ?? $key;
    }

    public static function short(string $key): string
    {
        return self::FARES[$key]['short'] ?? self::label($key);
    }

    /** Satış kartı JS'ine gömmek için sade dizi (json_encode edilir). */
    public static function forJs(bool $infantAllowed = true): array
    {
        return self::forTour($infantAllowed);
    }
}
