// ---------------------------------------------------------------------------
// BT.Framework
// ShowIfAttribute.cs — 조건부 인스펙터 노출 속성
// ---------------------------------------------------------------------------
using System;
using UnityEngine;

namespace BurningTimes.Core.Attribute
{
    /// <summary>
    /// 동일 오브젝트의 다른 필드·프로퍼티 값이 <see cref="ExpectedValue"/>와 일치할 때만
    /// 인스펙터에 필드를 표시한다.
    /// </summary>
    /// <remarks>
    /// <para>설계 문서 §5 Tier 1. 기존 코어의 조건부 노출 기능을 범용화했다.</para>
    /// <para>비교 규칙:</para>
    /// <list type="bullet">
    ///   <item><description><see cref="ExpectedValue"/>가 <c>null</c>이면 대상 멤버의 truthy 여부로 판정
    ///     (bool은 자기자신, 숫자는 0이 아닐 때, 참조는 non-null 일 때 true).</description></item>
    ///   <item><description>값 비교는 <see cref="object.Equals(object)"/> 로 수행한다.</description></item>
    ///   <item><description>대상 멤버가 없거나 접근 불가면 필드는 기본 노출된다(Editor 오류 대신 안전한 기본값).</description></item>
    /// </list>
    /// <para>실제 그리기는 Editor 스크립트 <c>ShowIfDrawer</c>에서 담당하며, 런타임 동작에는 영향을 주지 않는다.</para>
    /// <para>사용 예:</para>
    /// <code>
    /// [SerializeField] private bool _useCustomRange;
    /// [SerializeField, ShowIf(nameof(_useCustomRange))] private Vector2 _range;
    /// </code>
    /// </remarks>
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
    public sealed class ShowIfAttribute : PropertyAttribute
    {
        /// <summary>감시할 멤버(필드·프로퍼티) 이름.</summary>
        public string MemberName { get; }

        /// <summary>비교 대상 값. <c>null</c>이면 truthy 비교를 수행한다.</summary>
        public object ExpectedValue { get; }

        /// <summary>조건 불일치 시 인스펙터에서 완전히 숨길지 여부. <c>false</c>면 비활성화만.</summary>
        public bool HideInInspector { get; }

        /// <summary>단순 truthy 조건을 설정한다.</summary>
        public ShowIfAttribute(string memberName, bool hideInInspector = true)
        {
            MemberName = memberName;
            ExpectedValue = null;
            HideInInspector = hideInInspector;
        }

        /// <summary>특정 값과 일치할 때만 노출한다.</summary>
        public ShowIfAttribute(string memberName, object expectedValue, bool hideInInspector = true)
        {
            MemberName = memberName;
            ExpectedValue = expectedValue;
            HideInInspector = hideInInspector;
        }
    }
}
