<?php

namespace App\Models\Quote;

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

/**
 * 수식 범위별 값 모델
 *
 * @property int $id
 * @property int $formula_id
 * @property float|null $min_value
 * @property float|null $max_value
 * @property string $condition_variable
 * @property string $result_value
 * @property string $result_type
 * @property int $sort_order
 */
class QuoteFormulaRange extends Model
{
    protected $table = 'quote_formula_ranges';

    protected $fillable = [
        'formula_id',
        'min_value',
        'max_value',
        'condition_variable',
        'result_value',
        'result_type',
        'sort_order',
    ];

    protected $casts = [
        'min_value' => 'decimal:4',
        'max_value' => 'decimal:4',
        'sort_order' => 'integer',
    ];

    protected $attributes = [
        'result_type' => 'fixed',
        'sort_order' => 0,
    ];

    public const RESULT_FIXED = 'fixed';

    public const RESULT_FORMULA = 'formula';

    // =========================================================================
    // Relationships
    // =========================================================================

    public function formula(): BelongsTo
    {
        return $this->belongsTo(QuoteFormula::class, 'formula_id');
    }

    // =========================================================================
    // Helper Methods
    // =========================================================================

    /**
     * 값이 범위 내에 있는지 확인
     */
    public function isInRange($value): bool
    {
        $min = $this->min_value;
        $max = $this->max_value;

        if (is_null($min) && is_null($max)) {
            return true;
        }

        if (is_null($min)) {
            return $value <= $max;
        }

        if (is_null($max)) {
            return $value >= $min;
        }

        return $value >= $min && $value <= $max;
    }

    /**
     * 범위 표시 문자열
     */
    public function getRangeLabelAttribute(): string
    {
        $min = $this->min_value;
        $max = $this->max_value;

        if (is_null($min) && is_null($max)) {
            return '전체';
        }

        if (is_null($min)) {
            return "~ {$max}";
        }

        if (is_null($max)) {
            return "{$min} ~";
        }

        return "{$min} ~ {$max}";
    }
}
