<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Spatie\Translatable\HasTranslations;

/**
 * @mixin IdeHelperListingFeature
 */
class ListingFeature extends Model
{
    use HasFactory, HasTranslations;

    // 'options' (kanonik değerler) çevrilmez; saklanan değerler dilden bağımsızdır.
    // 'option_labels' canonical→çevrilmiş etiket haritasını tutar (görünüm için).
    public array $translatable = ['name', 'option_labels'];

    protected $fillable = [
        'name',
        'key',
        'input_type',
        'unit',
        'options',
        'option_labels',
        'is_filterable',
        'is_active',
        'sort_order',
    ];

    protected $casts = [
        'options' => 'array',
        'is_filterable' => 'boolean',
        'is_active' => 'boolean',
        'sort_order' => 'integer',
    ];

    public function categories()
    {
        return $this->belongsToMany(
            ListingCategory::class,
            'category_features',
            'feature_id',
            'category_id'
        )
            ->withPivot(['is_required', 'sort_order'])
            ->withTimestamps();
    }

    public function values()
    {
        return $this->hasMany(ListingFeatureValue::class, 'feature_id');
    }

    /**
     * Kanonik seçenek değerlerini aktif dildeki etiketlere eşler.
     * Dönen: ["Natural Gas" => "Doğal Gaz", ...]. Etiket yoksa kanonik değere düşer.
     */
    public function localizedOptionLabels(): array
    {
        $options = $this->options ?? [];
        if (empty($options)) {
            return [];
        }

        $all = $this->getTranslations('option_labels'); // ['tr'=>[...], 'en'=>[...]]
        $loc = $all[app()->getLocale()] ?? [];
        $fallback = $all[config('app.fallback_locale')] ?? [];

        $result = [];
        foreach ($options as $opt) {
            $result[$opt] = $loc[$opt] ?? $fallback[$opt] ?? $opt;
        }

        return $result;
    }

    /** Tek bir kanonik değerin aktif dildeki etiketi (yoksa kanonik değer). */
    public function optionLabel(?string $value): ?string
    {
        if ($value === null) {
            return null;
        }

        return $this->localizedOptionLabels()[$value] ?? $value;
    }
}