<?php

namespace App\Models;

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

/**
 * Kaynağın varsayılan maliyet başlığı (ör. "Sigorta Maliyeti" — 1.500₺).
 * Bir kaynağın birden fazla başlığı olabilir; atama sırasında bu satırlar
 * ResourceScheduleCostItem olarak kopyalanır.
 */
class ResourceCostItem extends Model
{
    use HasFactory;

    protected $fillable = [
        'resource_id',
        'title',
        'amount',
        'currency',
        'sort_order',
    ];

    protected function casts(): array
    {
        return [
            'amount' => 'decimal:2',
            'sort_order' => 'integer',
        ];
    }

    public function resource()
    {
        return $this->belongsTo(Resource::class);
    }

    /** "Sigorta Maliyeti: 1.500,00₺" */
    public function getLabelAttribute(): string
    {
        return $this->title . ': ' . number_format((float) $this->amount, 2, ',', '.') . '₺';
    }

    /**
     * Bir acentede daha önce kullanılmış başlıklar (autocomplete önerisi).
     * Serbest metin girildiği için yazım varyantlarını azaltmak adına
     * benzersiz başlıklar kullanım sıklığına göre döner.
     */
    public static function titleSuggestions(int $agencyId, ?string $term = null, int $limit = 20): array
    {
        return static::query()
            ->join('resources', 'resources.id', '=', 'resource_cost_items.resource_id')
            ->where('resources.agency_id', $agencyId)
            ->whereNull('resources.deleted_at')
            ->when($term, fn ($q) => $q->where('resource_cost_items.title', 'like', '%' . $term . '%'))
            ->groupBy('resource_cost_items.title')
            ->orderByRaw('COUNT(*) DESC')
            ->orderBy('resource_cost_items.title')
            ->limit($limit)
            ->pluck('resource_cost_items.title')
            ->all();
    }
}
