<?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 ItemSection extends Model
{
    use Auditable, BelongsToTenant, ModelTrait, SoftDeletes;

    protected $fillable = [
        'tenant_id',
        'group_id',
        'title',
        'type',
        'order_no',
        'is_template',
        'is_default',
        'description',
        'created_by',
        'updated_by',
        'deleted_by',
    ];

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

    /**
     * 템플릿만 조회하는 스코프
     */
    public function scopeTemplates($query)
    {
        return $query->where('is_template', true);
    }

    /**
     * 일반 섹션만 조회하는 스코프 (템플릿 제외)
     */
    public function scopeNonTemplates($query)
    {
        return $query->where('is_template', false);
    }

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

    /**
     * 관련 엔티티(fields, bomItems) 로드
     *
     * entity_relationships 기반이므로 일반 Eloquent load() 대신 사용
     *
     * @return $this
     */
    public function loadRelatedEntities(): self
    {
        $this->setRelation('fields', $this->linkedFields()->orderBy('order_no')->get());
        $this->setRelation('bomItems', $this->linkedBomItems()->orderBy('id')->get());

        return $this;
    }

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

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

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

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

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

    /**
     * 섹션의 모든 자식 관계 목록 조회 (필드 + BOM)
     */
    public function allChildRelationships()
    {
        return $this->hasMany(EntityRelationship::class, 'parent_id')
            ->where('parent_type', EntityRelationship::TYPE_SECTION)
            ->orderBy('order_no');
    }

    /**
     * 섹션의 모든 부모 관계 목록 조회
     */
    public function allParentRelationships()
    {
        return EntityRelationship::where('child_type', EntityRelationship::TYPE_SECTION)
            ->where('child_id', $this->id);
    }
}
