<?php

namespace App\Models;

use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;

class Process extends Model
{
    use Auditable, BelongsToTenant;
    use HasFactory;
    use ModelTrait;
    use SoftDeletes;

    protected $fillable = [
        'tenant_id',
        'process_code',
        'process_name',
        'description',
        'process_type',
        'department',
        'work_log_template',
        'document_template_id',
        'work_log_template_id',
        'options',
        'required_workers',
        'equipment_info',
        'work_steps',
        'note',
        'is_active',
        'created_by',
        'updated_by',
        'deleted_by',
    ];

    protected $casts = [
        'work_steps' => 'array',
        'is_active' => 'boolean',
        'options' => 'array',
        'required_workers' => 'integer',
    ];

    /**
     * 중간검사 양식
     */
    public function documentTemplate(): BelongsTo
    {
        return $this->belongsTo(Documents\DocumentTemplate::class);
    }

    /**
     * 작업일지 양식 (관계명: work_log_template 컬럼과 충돌 방지)
     */
    public function workLogTemplateRelation(): BelongsTo
    {
        return $this->belongsTo(Documents\DocumentTemplate::class, 'work_log_template_id');
    }

    /**
     * 공정 자동 분류 규칙 (패턴 규칙)
     */
    public function classificationRules(): HasMany
    {
        return $this->hasMany(ProcessClassificationRule::class)->orderBy('priority');
    }

    /**
     * 공정-품목 연결 (중간 테이블)
     */
    public function processItems(): HasMany
    {
        return $this->hasMany(ProcessItem::class)->orderBy('priority');
    }

    /**
     * 연결된 품목 (다대다)
     */
    public function items(): BelongsToMany
    {
        return $this->belongsToMany(Items\Item::class, 'process_items')
            ->withPivot(['priority', 'is_active'])
            ->withTimestamps()
            ->orderByPivot('priority');
    }

    /**
     * 공정 단계
     */
    public function steps(): HasMany
    {
        return $this->hasMany(ProcessStep::class)->orderBy('sort_order');
    }

    /**
     * 작업지시들
     */
    public function workOrders(): HasMany
    {
        return $this->hasMany(Production\WorkOrder::class);
    }
}
