<?php

namespace App\Models\Tenants;

use App\Models\Members\User;
use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;

/**
 * 결재 양식 모델
 *
 * @property int $id
 * @property int $tenant_id
 * @property string $name
 * @property string $code
 * @property string|null $category
 * @property array $template
 * @property bool $is_active
 * @property int|null $created_by
 * @property int|null $updated_by
 * @property int|null $deleted_by
 */
class ApprovalForm extends Model
{
    use Auditable, BelongsToTenant, SoftDeletes;

    protected $table = 'approval_forms';

    protected $casts = [
        'template' => 'array',
        'is_active' => 'boolean',
    ];

    protected $fillable = [
        'tenant_id',
        'name',
        'code',
        'category',
        'template',
        'is_active',
        'created_by',
        'updated_by',
        'deleted_by',
    ];

    protected $attributes = [
        'is_active' => true,
    ];

    // =========================================================================
    // 카테고리 상수
    // =========================================================================

    public const CATEGORY_REQUEST = 'request';           // 품의서

    public const CATEGORY_EXPENSE = 'expense';           // 지출결의서

    public const CATEGORY_EXPENSE_ESTIMATE = 'expense_estimate'; // 지출 예상 내역서

    public const CATEGORIES = [
        self::CATEGORY_REQUEST,
        self::CATEGORY_EXPENSE,
        self::CATEGORY_EXPENSE_ESTIMATE,
    ];

    // =========================================================================
    // 관계 정의
    // =========================================================================

    /**
     * 이 양식으로 생성된 결재 문서들
     */
    public function approvals(): HasMany
    {
        return $this->hasMany(Approval::class, 'form_id');
    }

    /**
     * 생성자
     */
    public function creator(): BelongsTo
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    /**
     * 수정자
     */
    public function updater(): BelongsTo
    {
        return $this->belongsTo(User::class, 'updated_by');
    }

    // =========================================================================
    // 스코프
    // =========================================================================

    /**
     * 활성 양식만
     */
    public function scopeActive($query)
    {
        return $query->where('is_active', true);
    }

    /**
     * 특정 카테고리
     */
    public function scopeCategory($query, string $category)
    {
        return $query->where('category', $category);
    }

    // =========================================================================
    // 헬퍼 메서드
    // =========================================================================

    /**
     * 카테고리 라벨
     */
    public function getCategoryLabelAttribute(): string
    {
        return match ($this->category) {
            self::CATEGORY_REQUEST => '품의서',
            self::CATEGORY_EXPENSE => '지출결의서',
            self::CATEGORY_EXPENSE_ESTIMATE => '지출 예상 내역서',
            default => $this->category ?? '',
        };
    }
}
