<?php

namespace App\Models\Tenant;

use App\Models\Concerns\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;

class Unit extends Model
{
    use BelongsToTenant;

    protected $fillable = [
        'company_id', 'code', 'name_ro', 'name_ru', 'name_en',
        'is_active', 'sort_order',
    ];

    protected $casts = [
        'is_active' => 'bool',
        'sort_order' => 'int',
    ];

    /** Returns the localised name (name_ro / name_ru / name_en). Fallback: name_ro, then code. */
    public function label(?string $locale = null): string
    {
        $locale = $locale ?: app()->getLocale();
        $col = 'name_' . $locale;
        return $this->{$col} ?: ($this->name_ro ?: $this->code);
    }

    /** Options array keyed by id for Filament Select. */
    public static function forSelect(?string $locale = null): array
    {
        return static::query()
            ->where('is_active', true)
            ->orderBy('sort_order')
            ->orderBy('code')
            ->get()
            ->mapWithKeys(fn (Unit $u) => [$u->id => $u->label($locale)])
            ->all();
    }

    /** Look up label from either a Unit id or a legacy code string. */
    public static function labelFor(?int $unitId, ?string $codeFallback = null, ?string $locale = null): string
    {
        if ($unitId) {
            $u = static::find($unitId);
            if ($u) return $u->label($locale);
        }
        if ($codeFallback) {
            $u = static::where('code', $codeFallback)->first();
            if ($u) return $u->label($locale);
            return $codeFallback;
        }
        return '';
    }
}
