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

    protected $fillable = [
        'tenant_id',
        'group_id',
        'field_name',
        'field_key',
        'field_type',
        'order_no',
        'is_required',
        'default_value',
        'placeholder',
        'display_condition',
        'validation_rules',
        'options',
        'properties',
        'category',
        'description',
        'is_common',
        'is_active',
        'is_locked',
        'locked_by',
        'locked_at',
        'created_by',
        'updated_by',
        'deleted_by',
        // 내부용 매핑 컬럼
        'source_table',
        'source_column',
        'storage_type',
        'json_path',
    ];

    protected $casts = [
        'group_id' => 'integer',
        'order_no' => 'integer',
        'is_required' => 'boolean',
        'is_common' => 'boolean',
        'is_active' => 'boolean',
        'is_locked' => 'boolean',
        'display_condition' => 'array',
        'validation_rules' => 'array',
        'options' => 'array',
        'properties' => 'array',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
        'deleted_at' => 'datetime',
        'locked_at' => 'datetime',
    ];

    /**
     * API 응답에서 제외할 컬럼 (내부용)
     */
    protected $hidden = [
        'deleted_by',
        'deleted_at',
        // 내부용 매핑 컬럼 - API 응답에서 제외
        'source_table',
        'source_column',
        'storage_type',
        'json_path',
    ];

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

    /**
     * 이 필드가 직접 연결된 페이지들 조회 (링크 테이블 기반)
     */
    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_FIELD)
                ->where('child_id', $this->id);
        });
    }

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

    /**
     * 시스템 필드 여부 확인 (DB 컬럼과 매핑된 필드)
     */
    public function isSystemField(): bool
    {
        return ! is_null($this->source_table) && ! is_null($this->source_column);
    }

    /**
     * 컬럼 저장 방식 여부 확인
     */
    public function isColumnStorage(): bool
    {
        return $this->storage_type === 'column';
    }

    /**
     * JSON 저장 방식 여부 확인
     */
    public function isJsonStorage(): bool
    {
        return $this->storage_type === 'json';
    }
}
