<?php

namespace App\Models\ItemMaster;

use App\Traits\Auditable;
use App\Traits\BelongsToTenant;
use App\Traits\ModelTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class ItemPage extends Model
{
    use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;

    protected $fillable = [
        'tenant_id',
        'group_id',
        'page_name',
        'item_type',
        'source_table',  // 실제 저장 테이블명 (products, materials 등)
        'absolute_path',
        'is_active',
        'created_by',
        'updated_by',
        'deleted_by',
    ];

    protected $casts = [
        'group_id' => 'integer',
        'is_active' => 'boolean',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
        'deleted_at' => 'datetime',
    ];

    protected $hidden = [
        'deleted_by',
        'deleted_at',
    ];

    /**
     * 페이지와 연결된 섹션 관계 목록 (링크 테이블 기반)
     */
    public function sectionRelationships()
    {
        return $this->hasMany(EntityRelationship::class, 'parent_id')
            ->where('parent_type', EntityRelationship::TYPE_PAGE)
            ->where('child_type', EntityRelationship::TYPE_SECTION)
            ->orderBy('order_no');
    }

    /**
     * 페이지와 직접 연결된 필드 관계 목록 (링크 테이블 기반)
     */
    public function fieldRelationships()
    {
        return $this->hasMany(EntityRelationship::class, 'parent_id')
            ->where('parent_type', EntityRelationship::TYPE_PAGE)
            ->where('child_type', EntityRelationship::TYPE_FIELD)
            ->orderBy('order_no');
    }

    /**
     * 페이지에 연결된 섹션들 조회 (링크 테이블 기반)
     */
    public function linkedSections()
    {
        return ItemSection::whereIn('id', function ($query) {
            $query->select('child_id')
                ->from('entity_relationships')
                ->where('parent_type', EntityRelationship::TYPE_PAGE)
                ->where('parent_id', $this->id)
                ->where('child_type', EntityRelationship::TYPE_SECTION);
        });
    }

    /**
     * 페이지에 직접 연결된 필드들 조회 (링크 테이블 기반)
     */
    public function linkedFields()
    {
        return ItemField::whereIn('id', function ($query) {
            $query->select('child_id')
                ->from('entity_relationships')
                ->where('parent_type', EntityRelationship::TYPE_PAGE)
                ->where('parent_id', $this->id)
                ->where('child_type', EntityRelationship::TYPE_FIELD);
        });
    }

    /**
     * 페이지의 모든 관계 목록 조회 (섹션 + 직접 연결된 필드)
     */
    public function allRelationships()
    {
        return $this->hasMany(EntityRelationship::class, 'parent_id')
            ->where('parent_type', EntityRelationship::TYPE_PAGE)
            ->orderBy('order_no');
    }

    /**
     * source_table에 해당하는 모델 클래스명 반환
     */
    public function getTargetModelClass(): ?string
    {
        $mapping = [
            'items' => \App\Models\Items\Item::class,
        ];

        return $mapping[$this->source_table] ?? null;
    }

    /**
     * 통합 품목 페이지인지 확인
     */
    public function isItemPage(): bool
    {
        return $this->source_table === 'items';
    }

    /**
     * 제품 페이지인지 확인 (하위 호환성)
     */
    public function isProductPage(): bool
    {
        return $this->source_table === 'products';
    }

    /**
     * 자재 페이지인지 확인 (하위 호환성)
     */
    public function isMaterialPage(): bool
    {
        return $this->source_table === 'materials';
    }

    /**
     * Product 타입 품목인지 확인 (items 테이블 기준)
     */
    public function isProductType(): bool
    {
        return in_array($this->item_type, ['FG', 'PT']);
    }

    /**
     * Material 타입 품목인지 확인 (items 테이블 기준)
     */
    public function isMaterialType(): bool
    {
        return in_array($this->item_type, ['SM', 'RM', 'CS']);
    }
}
