<?php

namespace App\Models\Production;

use App\Models\Items\Item;
use App\Models\Orders\OrderItem;
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;

/**
 * 작업지시 품목 모델
 */
class WorkOrderItem extends Model
{
    use Auditable, BelongsToTenant;

    protected $table = 'work_order_items';

    protected $fillable = [
        'tenant_id',
        'work_order_id',
        'source_order_item_id', // 원본 수주 품목 추적용
        'item_id',
        'item_name',
        'specification',
        'quantity',
        'unit',
        'sort_order',
        'status',
        'options',
    ];

    /**
     * 품목 상태 상수
     */
    public const STATUS_WAITING = 'waiting';

    public const STATUS_IN_PROGRESS = 'in_progress';

    public const STATUS_COMPLETED = 'completed';

    public const STATUSES = [
        self::STATUS_WAITING,
        self::STATUS_IN_PROGRESS,
        self::STATUS_COMPLETED,
    ];

    protected $casts = [
        'quantity' => 'decimal:2',
        'sort_order' => 'integer',
        'options' => 'array',
    ];

    // ──────────────────────────────────────────────────────────────
    // 관계
    // ──────────────────────────────────────────────────────────────

    /**
     * 작업지시
     */
    public function workOrder(): BelongsTo
    {
        return $this->belongsTo(WorkOrder::class);
    }

    /**
     * 품목
     */
    public function item(): BelongsTo
    {
        return $this->belongsTo(Item::class);
    }

    /**
     * 원본 수주 품목
     */
    public function sourceOrderItem(): BelongsTo
    {
        return $this->belongsTo(OrderItem::class, 'source_order_item_id');
    }

    /**
     * 자재 투입 이력
     */
    public function materialInputs(): HasMany
    {
        return $this->hasMany(WorkOrderMaterialInput::class);
    }

    // ──────────────────────────────────────────────────────────────
    // 스코프
    // ──────────────────────────────────────────────────────────────

    /**
     * 정렬 순서
     */
    public function scopeOrdered($query)
    {
        return $query->orderBy('sort_order');
    }

    /**
     * 완료된 품목만 필터
     */
    public function scopeCompleted($query)
    {
        return $query->where('status', self::STATUS_COMPLETED);
    }

    /**
     * 작업 결과가 있는 품목만 필터
     */
    public function scopeHasResult($query)
    {
        return $query->whereNotNull('options->result');
    }

    // ──────────────────────────────────────────────────────────────
    // 헬퍼 메서드
    // ──────────────────────────────────────────────────────────────

    /**
     * 중간검사 데이터 가져오기
     */
    public function getInspectionData(): ?array
    {
        return $this->options['inspection_data'] ?? null;
    }

    /**
     * 중간검사 데이터 설정
     */
    public function setInspectionData(array $data): void
    {
        $options = $this->options ?? [];
        $options['inspection_data'] = $data;
        $this->options = $options;
    }

    /**
     * 작업 결과 데이터 가져오기
     */
    public function getResult(): ?array
    {
        return $this->options['result'] ?? null;
    }

    /**
     * 작업 결과 데이터 설정
     */
    public function setResult(array $result): void
    {
        $options = $this->options ?? [];
        $options['result'] = array_merge($options['result'] ?? [], $result);
        $this->options = $options;
    }

    /**
     * 작업 완료 처리 (결과 데이터 저장)
     */
    public function completeWithResult(array $resultData = []): void
    {
        $this->status = self::STATUS_COMPLETED;

        $result = [
            'completed_at' => now()->toDateTimeString(),
            'good_qty' => $resultData['good_qty'] ?? $this->quantity,
            'defect_qty' => $resultData['defect_qty'] ?? 0,
            'lot_no' => $resultData['lot_no'] ?? null,
            'is_inspected' => $resultData['is_inspected'] ?? false,
            'is_packaged' => $resultData['is_packaged'] ?? false,
            'worker_id' => $resultData['worker_id'] ?? null,
            'memo' => $resultData['memo'] ?? null,
        ];

        // 불량률 자동 계산
        $totalQty = $result['good_qty'] + $result['defect_qty'];
        $result['defect_rate'] = $totalQty > 0
            ? round(($result['defect_qty'] / $totalQty) * 100, 2)
            : 0;

        $this->setResult($result);
        $this->save();
    }
}
