using UnityEngine;
using UVC.UI.Toolbar.Model;
using UVC.UI.Toolbar.View;

namespace UVC.UI.ToolBar.View
{
    /// <summary>
    /// 툴바 버튼의 UI 생성, 설정 및 업데이트 로직을 처리하는 인터페이스입니다.
    /// 각 버튼 타입(표준, 토글, 라디오, 확장 등)에 대한 구체적인 UI 처리 클래스가 이 인터페이스를 구현합니다.
    /// </summary>
    public interface IButtonViewProcessor
    {
        /// <summary>
        /// 지정된 버튼 모델에 대한 UI GameObject를 생성하고 초기화합니다.
        /// </summary>
        /// <param name="buttonModel">UI를 생성할 버튼의 데이터 모델입니다.</param>
        /// <param name="parentContainer">생성된 UI GameObject가 자식으로 추가될 부모 Transform입니다.</param>
        /// <param name="viewContext">현재 ToolbarView의 컨텍스트입니다. 프리팹 참조, 헬퍼 메서드 접근 등에 사용됩니다.</param>
        /// <returns>생성된 UI GameObject입니다. 생성 실패 시 null을 반환할 수 있습니다.</returns>
        GameObject CreateButtonUI(ToolbarButtonBase buttonModel, Transform parentContainer, ToolbarView viewContext);

        /// <summary>
        /// 생성된 버튼 UI GameObject에 대해 초기 시각적 요소(텍스트, 아이콘 등)를 설정하고,
        /// 사용자 상호작용(예: 클릭 이벤트) 시 모델의 메서드가 호출되도록 이벤트를 바인딩합니다.
        /// 또한, 모델의 상태 변경 이벤트(OnStateChanged, OnToggleStateChanged 등)를 구독하여 UI가 업데이트되도록 설정합니다.
        /// </summary>
        /// <param name="buttonModel">설정할 버튼의 데이터 모델입니다.</param>
        /// <param name="buttonUIObject">모델에 해당하는, 화면에 표시될 UI GameObject입니다.</param>
        /// <param name="viewContext">현재 ToolbarView의 컨텍스트입니다.</param>
        void SetupButtonInteractions(ToolbarButtonBase buttonModel, GameObject buttonUIObject, ToolbarView viewContext);

        /// <summary>
        /// 버튼 모델의 공통적인 상태(텍스트, 아이콘, 활성화 상태 등)가 변경되었을 때,
        /// 해당 버튼 UI의 시각적 요소를 업데이트합니다.
        /// </summary>
        /// <param name="buttonModel">상태가 변경된 버튼의 모델입니다.</param>
        /// <param name="buttonUIObject">업데이트할 UI GameObject입니다.</param>
        /// <param name="viewContext">현재 ToolbarView의 컨텍스트입니다.</param>
        void UpdateCommonButtonVisuals(ToolbarButtonBase buttonModel, GameObject buttonUIObject, ToolbarView viewContext);

        /// <summary>
        /// 토글 가능한 버튼(ToolbarToggleButton, ToolbarRadioButton)의 선택 상태(IsSelected)가 모델에서 변경되었을 때 호출됩니다.
        /// 해당 UI Toggle 컴포넌트의 isOn 상태를 모델의 IsSelected 값과 동기화합니다.
        /// </summary>
        /// <param name="toggleButtonModel">IsSelected 상태가 변경된 토글/라디오 버튼의 모델입니다.</param>
        /// <param name="buttonUIObject">업데이트할 UI GameObject입니다.</param>
        /// <param name="isSelected">모델의 새로운 IsSelected 값입니다.</param>
        /// <param name="viewContext">현재 ToolbarView의 컨텍스트입니다.</param>
        void UpdateToggleStateVisuals(ToolbarToggleButton toggleButtonModel, GameObject buttonUIObject, bool isSelected, ToolbarView viewContext);
    }
}
