<?php

namespace App\Models\Agency;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * Acente bazında fiyat sınıfı (uçak bileti sınıfı benzeri).
 * Taban sınıf fiyatından, diff_type/diff_value ile türetilir.
 */
class TourClass extends Model
{
    protected $table = 'tour_classes';

    protected $fillable = [
        'agency_id', 'tour_class_group_id', 'name', 'code', 'is_base', 'diff_type', 'diff_value', 'sort_order', 'is_active',
    ];

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

    public function agency(): BelongsTo
    {
        return $this->belongsTo(Agency::class);
    }

    public function group(): BelongsTo
    {
        return $this->belongsTo(TourClassGroup::class, 'tour_class_group_id');
    }

    public function scopeActive($query)
    {
        return $query->where('is_active', true);
    }

    /**
     * Verilen sınıflar içinden en yüksek (en pahalı) sınıfı döndürür.
     * Karşılaştırma taban=100 üzerinden türetilen fiyatla yapılır.
     * Sınıf kapasiteleri toplamı kontenjanı karşılamazsa kalan kişiler bu sınıftan fiyatlanır.
     */
    public static function highestOf($classes): ?self
    {
        return collect($classes)->sortByDesc(fn ($c) => $c->deriveFrom(100))->first();
    }

    /**
     * Taban fiyattan bu sınıfın fiyatını türetir.
     * percent → base * (1 + value/100), amount → base + value (aynı para biriminde).
     */
    public function deriveFrom(float $basePrice): float
    {
        if ($this->is_base) {
            return round($basePrice, 2);
        }
        $v = (float) $this->diff_value;
        $price = $this->diff_type === 'amount' ? $basePrice + $v : $basePrice * (1 + $v / 100);
        return round(max(0, $price), 2);
    }
}
