<?php

namespace App\Models\Definition;

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

class Country extends Model
{
    use HasFactory;

    protected $table = 'countries';

    protected $fillable = [
        'name',
        'code',
        'passport_code',
    ];

    /** İstek boyunca tekrar tekrar sorgu atmamak için okunan kod listesi. */
    protected static ?array $codeCache = null;

    /**
     * Aranabilir seçici için hazır liste: değer ISO kodu, etiket Türkçe ad.
     *
     * Uyruk/ülke sütunları 2 karakterlik KOD tutar, kullanıcı ise ADI bilir.
     * Ekran metniyle kaydedilen değeri ayıran tek yer burasıdır; hem lookup
     * ucu hem de sunucu tarafındaki etiket çözümü bu listeyi kullanır.
     */
    public static function pickerOptions(): array
    {
        return static::orderBy('name')
            ->get(['name', 'code', 'passport_code'])
            ->map(fn (self $c) => [
                'value' => strtoupper(trim((string) $c->code)),
                'label' => $c->name,
                // Pasaport kodu (TUR/DEU) aramada da eşleşsin: pasaporttan
                // veri giren operatör alpha-3 kodu ezberlemiş oluyor.
                'hint' => $c->passport_code ? strtoupper(trim($c->passport_code)) : null,
            ])
            ->all();
    }

    /**
     * Doğrulamada kabul edilen ISO kodları.
     *
     * Liste hiç seed edilmemişse BOŞ döner; çağıran taraf o durumda kod
     * denetimini atlar. Aksi hâlde kurulumu eksik bir panelde uyruk alanı
     * hiç kaydedilemez, kullanıcı da nedenini anlayamazdı.
     */
    public static function validCodes(): array
    {
        if (static::$codeCache === null) {
            static::$codeCache = static::query()
                ->pluck('code')
                ->map(fn ($c) => strtoupper(trim((string) $c)))
                ->filter()
                ->unique()
                ->values()
                ->all();
        }

        return static::$codeCache;
    }

    /** Koda karşılık gelen ülke adı; bilinmiyorsa kodun kendisi. */
    public static function nameByCode(?string $code): string
    {
        $code = strtoupper(trim((string) $code));
        if ($code === '') {
            return '';
        }

        return static::where('code', $code)->value('name') ?? $code;
    }
}
