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

namespace UVC.UI.Toolbar.View
{
    /// <summary>
    /// 표준 툴바 버튼(ToolbarStandardButton)의 UI 생성, 이벤트 연결, 시각적 업데이트를 처리하는 클래스입니다.
    /// IButtonViewProcessor 인터페이스를 구현하여 ToolbarView가 표준 버튼을 일관된 방식으로 다룰 수 있도록 합니다.
    /// </summary>
    /// <remarks>
    /// 이 클래스의 주요 역할:
    /// 1. UI 생성: ToolbarView에 설정된 '표준 버튼 프리팹'을 사용하여 버튼의 GameObject를 만듭니다.
    /// 2. 상호작용 설정: 생성된 버튼 UI(UnityEngine.UI.Button)가 클릭되었을 때,
    ///    연결된 ToolbarStandardButton 모델의 ExecuteClick 메서드가 호출되도록 설정합니다.
    /// 3. 시각적 업데이트: 버튼 모델의 상태(텍스트, 아이콘, 활성화 상태 등)가 변경되면,
    ///    화면에 보이는 버튼의 모습도 그에 맞게 업데이트합니다.
    /// </remarks>
    /// <example>
    /// <code>
    /// // ToolbarView 내에서 이 프로세서가 사용되는 방식 (간략화된 예시):
    /// // 1. ToolbarModel로부터 ToolbarStandardButton 객체를 가져옵니다.
    /// // ToolbarStandardButton standardButtonModel = new ToolbarStandardButton { Text = "Save", ... };
    /// 
    /// // 2. ToolbarView는 해당 모델 타입에 맞는 Processor를 찾습니다.
    /// // IButtonViewProcessor processor = GetButtonViewProcessor(typeof(ToolbarStandardButton));
    /// // (이때, ToolbarStandardButtonViewProcessor 인스턴스가 반환됩니다)
    /// 
    /// // 3. UI 생성 요청
    /// // GameObject buttonUI = processor.CreateButtonUI(standardButtonModel, toolbarContainer, this);
    /// 
    /// // 4. 상호작용 및 초기 시각적 요소 설정 요청
    /// // processor.SetupButtonInteractions(standardButtonModel, buttonUI, this);
    /// 
    /// // 5. 모델의 상태가 변경되면(예: standardButtonModel.Text = "Save As";) OnStateChanged 이벤트가 발생하고,
    /// //    ToolbarView는 다시 processor.UpdateCommonButtonVisuals()를 호출하여 UI를 업데이트합니다.
    /// // standardButtonModel.OnStateChanged += () => processor.UpdateCommonButtonVisuals(standardButtonModel, buttonUI, this);
    /// </code>
    /// </example>
    public class ToolbarStandardButtonViewProcessor : IButtonViewProcessor
    {
        /// <summary>
        /// ToolbarStandardButton 모델에 해당하는 UI GameObject를 생성합니다.
        /// ToolbarView에 있는 standardButtonPrefab을 복제하여 사용합니다.
        /// </summary>
        /// <param name="buttonModel">UI를 생성할 기반이 되는 버튼 데이터 모델 (ToolbarButtonBase 타입이지만, 실제로는 ToolbarStandardButton으로 간주됨).</param>
        /// <param name="parentContainer">생성된 버튼 UI가 자식으로 추가될 부모 Transform 객체입니다.</param>
        /// <param name="viewContext">현재 ToolbarView의 인스턴스. 프리팹 참조나 다른 뷰 관련 기능에 접근할 때 사용됩니다.</param>
        /// <returns>성공적으로 생성된 버튼의 GameObject. 프리팹이 없으면 null을 반환합니다.</returns>
        public GameObject CreateButtonUI(ToolbarButtonBase buttonModel, Transform parentContainer, ToolbarView viewContext)
        {
            if (viewContext.standardButtonPrefab == null)
            {
                Debug.LogError("StandardButtonViewProcessor: standardButtonPrefab이 ToolbarView에 할당되지 않았습니다.", viewContext);
                return null;
            }
            // standardButtonPrefab을 복제하여 새로운 버튼 UI GameObject를 만듭니다.
            // parentContainer의 자식으로 생성되어 툴바 레이아웃에 포함됩니다.
            return Object.Instantiate(viewContext.standardButtonPrefab, parentContainer);
        }

        /// <summary>
        /// 생성된 표준 버튼 UI GameObject에 필요한 상호작용을 설정하고 초기 시각적 상태를 업데이트합니다.
        /// - UI 버튼 클릭 시 모델의 ExecuteClick 메서드 호출 설정
        /// - 모델의 초기 텍스트, 아이콘, 활성화 상태를 UI에 반영
        /// </summary>
        /// <param name="buttonModel">설정 대상 버튼의 데이터 모델 (ToolbarStandardButton으로 캐스팅하여 사용).</param>
        /// <param name="buttonUIObject">화면에 표시된, 설정할 버튼의 UI GameObject.</param>
        /// <param name="viewContext">현재 ToolbarView의 인스턴스.</param>
        public void SetupButtonInteractions(ToolbarButtonBase buttonModel, GameObject buttonUIObject, ToolbarView viewContext)
        {
            // buttonModel을 실제 타입인 ToolbarStandardButton으로 변환합니다.
            ToolbarStandardButton standardModel = buttonModel as ToolbarStandardButton;
            if (standardModel == null) return;

            // 버튼 UI GameObject에서 UnityEngine.UI.Button 컴포넌트를 가져옵니다.
            Button uiButton = buttonUIObject.GetComponent<Button>();
            if (uiButton != null)
            {
                // 버튼 클릭 이벤트에 리스너(실행할 함수)를 추가합니다.
                // 버튼이 클릭되면 standardModel의 ExecuteClick 메서드가 호출됩니다.
                // standardModel.Text를 파라미터로 전달하는 것은 예시이며, 필요에 따라 null이나 다른 값을 전달할 수 있습니다.
                uiButton.onClick.AddListener(() =>
                {
                    standardModel.ExecuteClick(standardModel.Text); // 모델의 클릭 로직 실행
                });
            }
            else
            {
                Debug.LogError($"StandardButtonViewProcessor: StandardButton '{standardModel.Text}'의 GameObject에 Button 컴포넌트가 없습니다.", buttonUIObject);
            }

            // 버튼의 초기 시각적 상태(텍스트, 아이콘, 활성화 상태 등)를 설정합니다.
            UpdateCommonButtonVisuals(buttonModel, buttonUIObject, viewContext);
        }

        /// <summary>
        /// 버튼 모델의 공통적인 시각적 속성(텍스트, 아이콘, 활성화 상태)이 변경되었을 때 UI를 업데이트합니다.
        /// 실제 업데이트 로직은 ToolbarView의 InternalUpdateCommonButtonVisuals 메서드에 위임합니다.
        /// </summary>
        /// <param name="buttonModel">상태가 변경된 버튼의 데이터 모델.</param>
        /// <param name="buttonUIObject">업데이트할 UI GameObject.</param>
        /// <param name="viewContext">현재 ToolbarView의 인스턴스.</param>
        public void UpdateCommonButtonVisuals(ToolbarButtonBase buttonModel, GameObject buttonUIObject, ToolbarView viewContext)
        {
            // ToolbarView에 있는 공통 UI 업데이트 로직을 호출합니다.
            // 이 메서드는 버튼의 텍스트, 아이콘, 활성화(interactable) 상태 등을 모델에 맞춰 업데이트합니다.
            viewContext.InternalUpdateCommonButtonVisuals(buttonModel, buttonUIObject);
        }

        /// <summary>
        /// 표준 버튼은 토글 상태(선택됨/해제됨)를 가지지 않으므로, 이 메서드는 아무 작업도 수행하지 않습니다.
        /// IButtonViewProcessor 인터페이스를 구현하기 위해 필요합니다.
        /// </summary>
        /// <param name="toggleButtonModel">토글 버튼 모델 (여기서는 사용되지 않음).</param>
        /// <param name="buttonUIObject">UI GameObject (여기서는 사용되지 않음).</param>
        /// <param name="isSelected">선택 상태 (여기서는 사용되지 않음).</param>
        /// <param name="viewContext">ToolbarView 컨텍스트 (여기서는 사용되지 않음).</param>
        public void UpdateToggleStateVisuals(ToolbarToggleButton toggleButtonModel, GameObject buttonUIObject, bool isSelected, ToolbarView viewContext)
        {
            // 표준 버튼은 별도의 '토글 선택 상태'에 따른 시각적 변화가 없습니다.
            // 예를 들어, 배경색이 바뀌거나 체크마크가 표시되는 등의 변화가 없습니다.
            // 따라서 이 메서드는 비워둡니다.
        }
    }
}