using System.Collections.Generic;
using UVC.Log; // 필요에 따라 UVC.Log 또는 프로젝트별 로깅 시스템 사용
using UVC.UI.Commands;
using UVC.UI.Menu;

namespace SampleProject.UI.Menu
{
    /// <summary>
    /// <see cref="TopMenuController"/>를 상속받아 특정 프로젝트(예: SampleProject)에 맞게
    /// 상단 메뉴의 동작을 커스터마이징하는 컨트롤러 클래스입니다.
    /// 이 클래스는 프로젝트 고유의 메뉴 구조를 정의하고, 특정 View(<see cref="SampleProjectTopMenuView"/>)와 상호작용하며,
    /// 메뉴 아이템 클릭 시 프로젝트별 추가 로직을 수행할 수 있습니다.
    /// </summary>
    /// <remarks>
    /// 이 컨트롤러는 <see cref="SampleProjectTopMenuView"/>와 함께 사용되도록 설계되었습니다.
    /// 만약 <see cref="SampleProjectTopMenuView"/>를 찾지 못하면, 부모 클래스의 로직에 따라
    /// 기본 <see cref="TopMenuView"/>를 사용하려고 시도할 수 있습니다.
    /// </remarks>
    public class SampleProjectTopMenuController : TopMenuController
    {
        protected override void Awake()
        {
            // 1. 이 GameObject에 연결된 SampleProjectTopMenuView 컴포넌트를 찾습니다.
            //    view 필드는 부모 클래스 TopMenuController에 protected TopMenuView view; 로 선언되어 있습니다.
            //    SampleProjectTopMenuView는 TopMenuView를 상속해야 이 할당이 유효합니다.
            view = GetComponent<SampleProjectTopMenuView>();

            // 2. 만약 현재 GameObject에 없다면, 자식 GameObject들 중에서 SampleProjectTopMenuView 컴포넌트를 찾습니다.
            if (view == null)
            {
                view = GetComponentInChildren<SampleProjectTopMenuView>();
            }

            // 3. 위 두 단계에서 SampleProjectTopMenuView를 찾지 못한 경우 (view가 여전히 null인 경우),
            //    부모 클래스의 Awake()를 호출합니다. 이는 부모 클래스가 정의한 방식대로
            //    (예: 기본 TopMenuView 타입으로) View를 찾도록 시도합니다.
            //    이것은 SampleProjectTopMenuView가 필수는 아니지만 권장되는 상황을 위한 대비책일 수 있습니다.
            if (view == null)
            {
                ULog.Warning("SampleProjectTopMenuView를 찾을 수 없어, 부모 클래스의 Awake()를 통해 TopMenuView로 검색을 시도합니다.");
                base.Awake(); // 부모 클래스(TopMenuController)의 Awake 로직 실행
            }
        }

        /// <summary>
        /// MonoBehaviour의 Start 메시지입니다.
        /// 이 프로젝트(<c>SampleProject</c>)에 맞는 메뉴 시스템을 초기화합니다.
        /// 모델 생성, <see cref="LocalizationManager"/> 인스턴스 설정, 메뉴 아이템 데이터 정의,
        /// View에 메뉴 UI 생성 요청, 그리고 필요한 이벤트 핸들러들을 등록합니다.
        /// </summary>
        /// <remarks>
        /// 이 메서드는 부모 클래스 <see cref="TopMenuController"/>의 <c>Start()</c> 메서드를 호출하지 않고,
        /// 메뉴 구성을 완전히 새로 정의합니다. 만약 부모의 <c>Start()</c> 로직 일부를 재사용하고 싶다면,
        /// <c>base.Start()</c>를 적절한 위치에 호출하고, 필요한 부분만 수정해야 합니다.
        /// </remarks>
        protected override void Start()
        {
            // 모델(model)과 지역화 관리자(_locManager) 필드는 부모 클래스에 protected로 선언되어 있어 직접 접근 가능합니다.

            // 1. 메뉴 데이터 모델 인스턴스 생성
            //    (새 TopMenuModel을 사용하거나, 이 프로젝트를 위한 커스텀 모델이 있다면 그것을 사용합니다.)
            model = new TopMenuModel();

            // 2. 다국어 처리(Localization)를 위한 LocalizationManager 인스턴스 가져오기
            _locManager = UVC.Locale.LocalizationManager.Instance;

            // 3. View 컴포넌트 유효성 검사 (Awake에서 할당 시도)
            if (view == null)
            {
                ULog.Error("View 컴포넌트(SampleProjectTopMenuView 또는 TopMenuView)가 Inspector에서 할당되지 않았거나 찾을 수 없습니다. 메뉴가 표시되지 않습니다.");
                return; // View가 없으면 메뉴 시스템을 초기화할 수 없음
            }

            // 4. LocalizationManager 인스턴스 유효성 검사
            if (_locManager == null)
            {
                // _locManager가 없어도 메뉴 자체는 표시될 수 있지만, 텍스트가 키 값으로 나오거나 언어 변경이 안 될 수 있습니다.
                ULog.Error("LocalizationManager 인스턴스를 찾을 수 없습니다. 메뉴 텍스트가 올바르게 표시되지 않거나 언어 변경 기능이 작동하지 않을 수 있습니다.");
            }

            // 5. 이 프로젝트에 특화된 메뉴 아이템들로 모델을 채웁니다.
            InitializeMenuItems(); // 아래에 정의된 프로젝트별 메뉴 초기화 메서드 호출

            // 6. View에 기존 메뉴 아이템 UI를 모두 제거하도록 요청
            view.ClearMenuItems();
            // 7. View에 현재 모델 데이터를 기반으로 새로운 메뉴 UI를 생성하도록 요청
            //    view.MenuContainer는 View 내에서 메뉴 아이템들이 배치될 부모 Transform을 가리킵니다.
            view.CreateMenuItems(model.MenuItems, view.MenuContainer);

            // 8. View에서 발생하는 이벤트들에 대한 핸들러(메서드)를 등록합니다.
            //    부모 클래스(TopMenuController)에 정의된 핸들러를 재사용하거나,
            //    이 클래스에서 override하여 프로젝트별 로직을 추가할 수 있습니다.
            view.OnMenuItemClicked += HandleMenuItemClicked; // 메뉴 아이템 클릭 이벤트 처리
            if (_locManager != null)
            {
                _locManager.OnLanguageChanged += HandleLanguageChanged; // 언어 변경 이벤트 처리
            }

            ULog.Debug("SampleProjectTopMenuController의 Start 메서드가 실행 완료되었습니다.");
        }

        // 부모 클래스(TopMenuController)의 OnDestroy 메서드를 그대로 사용합니다.
        // 만약 이 프로젝트에서만 특별히 해제해야 할 리소스가 있다면,
        // OnDestroy를 override하고 base.OnDestroy()를 호출한 후 추가 로직을 작성할 수 있습니다.
        // 예시:
        // protected override void OnDestroy()
        // {
        //     base.OnDestroy(); // 부모 클래스의 리소스 해제 로직 실행 (이벤트 핸들러 해제 등)
        //     ULog.Debug("[SampleProject] OnDestroy 호출됨. 프로젝트별 리소스 해제 로직 수행 가능.");
        //     // 여기에 SampleProjectTopMenuController에서만 할당한 리소스가 있다면 해제합니다.
        // }

        /// <summary>
        /// <c>SampleProject</c>에 특화된 메뉴 아이템들을 정의하고 모델(<see cref="model"/>)에 추가합니다.
        /// 이 메서드는 <see cref="TopMenuController.InitializeMenuItems"/>를 오버라이드하여
        /// 프로젝트 고유의 메뉴 구조를 설정합니다.
        /// </summary>
        protected override void InitializeMenuItems()
        {
            model.MenuItems.Clear(); // 메뉴를 새로 구성하므로, 기존에 있을 수 있는 아이템들을 모두 제거합니다.

            // '메인 메뉴' (가상) 아래에 '파일', '편집', '도움말', '언어' 등의 주 메뉴를 구성합니다.
            // 실제 UI에서는 'menu'라는 최상위 아이템 없이 바로 '파일', '편집' 등이 표시될 수 있습니다.
            // 여기서는 구조화를 위해 하나의 루트 아이템 아래에 다른 메뉴들을 추가하는 형태로 구성합니다.
            // 만약 최상위 메뉴가 여러 개 병렬로 존재해야 한다면, model.MenuItems.Add()를 여러 번 호출하면 됩니다.
            // 이 예제에서는 하나의 "menu"라는 논리적 그룹 아래 모든 것을 배치합니다.
            // 실제 표시 방식은 TopMenuView의 CreateMenuItems 로직에 따라 달라집니다.
            // 현재 TopMenuController의 InitializeMenuItems는 여러 최상위 메뉴를 직접 model.MenuItems에 추가하므로,
            // 그 방식을 따르려면 아래의 "menu" 그룹 없이 바로 model.MenuItems.Add(new MenuItemData("file", ...)) 등을 호출합니다.
            // 여기서는 TopMenuController와 유사하게 직접 최상위 메뉴들을 추가하는 방식으로 수정합니다.

            model.MenuItems.Add(new MenuItemData("menu", "menu", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨"), subMenuItems: new List<MenuItemData>
            {
                new MenuItemData("file", "menu_file", subMenuItems: new List<MenuItemData>
                {
                    new MenuItemData("file_new_file", "menu_file_new_file", new DebugLogCommand("[SampleProject] 새 파일 선택됨")),
                    // "파일 열기" 메뉴 아이템 생성 시 isEnabled: false로 설정하여 비활성화 상태로 초기화합니다.
                    // 부모 TopMenuController의 HandleMenuItemClicked에서 이 상태를 확인하여 클릭을 무시합니다.
                    new MenuItemData("file_open", "menu_file_open", new DebugLogCommand("[SampleProject] 파일 열기 선택됨"), isEnabled: false),
                    MenuItemData.CreateSeparator("file_sep_sample1"),
                    new MenuItemData("project_settings", "project_settings", new DebugLogCommand("[SampleProject] 프로젝트 설정 선택됨")), // 프로젝트별 메뉴 아이템
                    MenuItemData.CreateSeparator("file_sep_sample2"),
                    new MenuItemData("file_exit", "menu_file_exit", new QuitApplicationCommand())
                }),
                new MenuItemData("edit", "menu_edit", subMenuItems: new List<MenuItemData>
                {
                    new MenuItemData("edit_undo", "menu_edit_undo", new DebugLogCommand("[SampleProject] 실행 취소 선택됨")),
                    new MenuItemData("edit_redo", "menu_edit_redo", new DebugLogCommand("[SampleProject] 다시 실행 선택됨"))
                }),
                new MenuItemData("help", "menu_help", subMenuItems: new List<MenuItemData>
                {
                    new MenuItemData("help_about", "menu_about", new DebugLogCommand("[SampleProject] 프로그램 정보 선택됨"))
                }),
                new MenuItemData("language", "menu_language", subMenuItems: new List<MenuItemData>
                {
                    new MenuItemData("lang_ko", "menu_lang_korean", new ChangeLanguageCommand("ko-KR")),
                    new MenuItemData("lang_en", "menu_lang_english", new ChangeLanguageCommand("en-US")),
                    // new MenuItemData("lang_jp", "menu_lang_japanese", new ChangeLanguageCommand("ja-JP")) // 예: 일본어 추가
                })
            }));


            // 특정 조건에 따라 메뉴 아이템의 활성화 상태를 동적으로 변경하는 예시입니다.
            // 예를 들어, 특정 기능이 사용 가능한 상태일 때만 관련 메뉴를 활성화할 수 있습니다.
            // bool isProjectLoaded = CheckProjectLoadedStatus(); // 실제 프로젝트 로드 상태를 확인하는 가상 메서드
            // if (isProjectLoaded)
            // {
            //     // SetMenuItemEnabled 메서드는 부모 클래스 TopMenuController로부터 상속받아 사용합니다.
            //     // 이 메서드는 메뉴 모델의 IsEnabled 값을 변경하고, View의 해당 버튼 UI 상태(interactable)도 업데이트합니다.
            //     SetMenuItemEnabled("project_settings", true);
            //     ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 활성화되었습니다 (조건부 로직).");
            // }
        }

        // HandleMenuItemClicked와 HandleLanguageChanged 메서드는
        // 부모 클래스(TopMenuController)에 이미 구현된 기본적인 처리 로직을 사용합니다.
        // (메뉴 아이템의 IsEnabled 상태 체크, Command 실행, 메뉴 텍스트 업데이트 등)
        // 만약 이 프로젝트에서만 특별히 추가하거나 변경해야 할 동작이 있다면,
        // 아래와 같이 해당 메서드들을 override하여 커스터마이징할 수 있습니다.

        // 예시: 메뉴 아이템 클릭 시 추가적인 프로젝트별 로직 수행
        // protected override void HandleMenuItemClicked(MenuItemData clickedItemData)
        // {
        //     // 1. 부모 클래스의 HandleMenuItemClicked를 호출하여 기본적인 처리(IsEnabled 체크, Command 실행 등)를 수행합니다.
        //     base.HandleMenuItemClicked(clickedItemData);
        //
        //     // 2. 부모 로직 실행 후, 이 프로젝트에 필요한 추가적인 동작을 수행합니다.
        //     //    주의: base.HandleMenuItemClicked 내부에서 IsEnabled가 false이면 Command가 실행되지 않고 반환될 수 있습니다.
        //     //    따라서, 여기서도 IsEnabled를 다시 한번 확인하거나, Command가 실제로 실행되었는지 여부를 알 수 있는 방법이 필요할 수 있습니다.
        //     //    (예: base.HandleMenuItemClicked가 bool 값을 반환하도록 수정)
        //     //    현재는 부모 메서드가 void이므로, 아래 로직은 부모 메서드 실행 후 항상 시도됩니다.
        //     if (clickedItemData.IsEnabled && !clickedItemData.IsSeparator) // 활성화된 실제 메뉴 아이템에 대해서만
        //     {
        //          ULog.Debug($"[SampleProject] 메뉴 아이템 '{clickedItemData.ItemId}' 클릭됨 (SampleProjectController에서 추가 처리)");
        //
        //          // 프로젝트별 추가 클릭 처리 로직 예시
        //          if (clickedItemData.ItemId == "project_settings")
        //          {
        //              // OpenProjectSpecificSettingsWindow(); // 프로젝트 설정 창을 여는 메서드 호출 등
        //              ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴에 대한 특별한 동작 수행!");
        //          }
        //     }
        // }

        // 예시: 언어 변경 시 추가적인 프로젝트별 UI 업데이트 수행
        // protected override void HandleLanguageChanged(string newLanguageCode)
        // {
        //     // 1. 부모 클래스의 HandleLanguageChanged를 호출하여 기본 메뉴 텍스트 업데이트를 수행합니다.
        //     base.HandleLanguageChanged(newLanguageCode);
        //
        //     // 2. 이 프로젝트에 필요한 추가적인 언어 변경 관련 동작을 수행합니다.
        //     ULog.Debug($"[SampleProject] 언어가 '{newLanguageCode}'(으)로 변경됨 (SampleProjectController에서 추가 처리)");
        //     // 예: 메뉴 외 다른 UI 요소들의 텍스트도 업데이트
        //     // UpdateOtherProjectSpecificUITexts(newLanguageCode);
        // }

        // --- 아래는 메뉴 아이템의 활성화 상태를 외부에서 제어하는 예시 메서드들입니다. ---
        //     (주석 처리되어 있으며, 필요시 주석을 해제하고 실제 로직을 구현하여 사용할 수 있습니다.)

        /// <summary>
        /// (예시 메서드) 프로젝트 설정 메뉴의 접근 가능성(활성화 상태)을 업데이트합니다.
        /// 예를 들어, 프로젝트가 로드되었을 때만 "프로젝트 설정" 메뉴를 활성화할 수 있습니다.
        /// </summary>
        /// <param name="projectLoaded">프로젝트가 로드되었는지 여부입니다.</param>
        // public void UpdateProjectSettingsMenuAccess(bool projectLoaded)
        // {
        //     // "project_settings"라는 ID를 가진 메뉴 아이템의 활성화 상태를 변경합니다.
        //     // SetMenuItemEnabled 메서드는 부모 클래스 TopMenuController에 정의되어 있으며,
        //     // 모델 데이터 변경 및 UI(버튼의 interactable 속성) 업데이트를 모두 처리합니다.
        //     SetMenuItemEnabled("project_settings", projectLoaded);
        //
        //     if (projectLoaded)
        //     {
        //         ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 활성화되었습니다.");
        //     }
        //     else
        //     {
        //         ULog.Debug("[SampleProject] '프로젝트 설정' 메뉴가 비활성화되었습니다.");
        //     }
        // }

        /// <summary>
        /// (예시 메서드) 실제 프로젝트 로드 상태를 확인하는 로직입니다.
        /// </summary>
        /// <returns>프로젝트가 로드되었으면 true, 아니면 false를 반환합니다.</returns>
        // private bool CheckProjectLoadedStatus()
        // {
        //     // 여기에 실제 프로젝트 로드 상태를 확인하는 코드를 구현합니다.
        //     // 예: return ProjectManager.Instance.IsProjectCurrentlyLoaded;
        //     return true; // 이 예시에서는 항상 true를 반환하도록 되어 있습니다. 실제 구현 필요.
        // }
        // --- 예시 코드 끝 ---
    }
}