using Cysharp.Threading.Tasks;
using UVC.Locale;
using UVC.Log; // LocalizationManager 사용을 위해 추가

namespace UVC.UI.Modal
{
    /// <summary>
    /// 📜 모달 창에 어떤 내용을 보여줄지, 어떻게 행동할지 정하는 '레시피' 또는 '주문서' 같은 친구예요.
    /// 이 클래스의 객체를 만들어서 Modal.Open()에 전달하면, 여기에 적힌 대로 모달 창이 만들어져요.
    /// </summary>
    /// <example>
    /// <code>
    /// // "MyAwesomeModalPrefab"이라는 디자인을 사용하는 모달을 위한 레시피를 만들어요.
    /// var myRecipe = new ModalContent("Prefabs/UI/MyAwesomeModalPrefab")
    /// {
    ///     Title = "새로운 모험!", // 모달 창 제목
    ///     Message = "모험을 시작할 준비가 되었나요?", // 모달 창 메시지
    ///     ConfirmButtonText = "네, 갑시다!", // 확인 버튼 글자
    ///     ShowCancelButton = false // 취소 버튼은 안 보여줄래요.
    /// };
    ///
    /// // 이렇게 만든 레시피(myRecipe)를 Modal.Open()에 전달하면 모달이 뿅 나타나요!
    /// // bool userChoseConfirm = await Modal.Open<bool>(myRecipe);
    /// </code>
    /// </example>
    public class ModalContent
    {
        /// <summary>
        /// 🏷️ 모달 창의 제목이에요. 여기에 글자를 적으면 모달 창 맨 위에 크게 보여요.
        /// 예: "알림", "게임 저장", "친구 요청"
        /// </summary>
        public string Title { get; set; }

        /// <summary>
        /// 💬 모달 창에 보여줄 주요 메시지 내용이에요. 사용자에게 전달하고 싶은 말을 여기에 적어요.
        /// 예: "게임 설정을 저장했습니다.", "정말로 아이템을 구매하시겠어요?"
        /// </summary>
        public string Message { get; set; }

        private string _confirmButtonText = "확인";
        /// <summary>
        /// ✅ '확인' 버튼에 보여줄 글자예요.
        /// 특별히 정해주지 않으면 기본적으로 "확인" (또는 설정된 언어에 맞게)이라고 나와요.
        /// 직접 "네", "저장하기", "출발!" 처럼 원하는 글자로 바꿀 수 있어요.
        /// 다국어 키를 사용해서 설정할 수도 있어요. (예: "ui_button_confirm", "action_ok")
        /// </summary>
        public string ConfirmButtonText
        {
            get
            {
                // _confirmButtonText가 명시적으로 설정되지 않았고, LocalizationManager 사용이 가능하다면 번역된 문자열을 반환
                if (string.IsNullOrEmpty(_confirmButtonText) && LocalizationManager.Instance != null)
                {
                    return LocalizationManager.Instance.GetString(_confirmButtonText);
                }
                // 명시적으로 설정된 값이 있거나 LocalizationManager를 사용할 수 없다면 해당 값 또는 기본 키 반환
                return _confirmButtonText;
            }
            set => _confirmButtonText = value;
        }

        private string _cancelButtonText = "취소";
        /// <summary>
        /// ❌ '취소' 버튼에 보여줄 글자예요.
        /// 특별히 정해주지 않으면 기본적으로 "취소" (또는 설정된 언어에 맞게)이라고 나와요.
        /// 직접 "아니요", "닫기", "나중에" 처럼 원하는 글자로 바꿀 수 있어요.
        /// 다국어 키를 사용해서 설정할 수도 있어요. (예: "ui_button_cancel", "action_no")
        /// </summary>
        public string CancelButtonText
        {
            get
            {
                // _cancelButtonText가 명시적으로 설정되지 않았고, LocalizationManager 사용이 가능하다면 번역된 문자열을 반환
                if (string.IsNullOrEmpty(_cancelButtonText) && LocalizationManager.Instance != null)
                {
                    return LocalizationManager.Instance.GetString(_cancelButtonText);
                }
                // 명시적으로 설정된 값이 있거나 LocalizationManager를 사용할 수 없다면 해당 값 또는 기본 키 반환
                return _cancelButtonText;
            }
            set => _cancelButtonText = value;
        }

        /// <summary>
        /// 👍 '확인' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌)
        /// false로 바꾸면 '확인' 버튼이 사라져요.
        /// </summary>
        public bool ShowConfirmButton { get; set; } = true;

        /// <summary>
        /// 👎 '취소' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌)
        /// false로 바꾸면 '취소' 버튼이 사라져요.
        /// </summary>
        public bool ShowCancelButton { get; set; } = true;

        /// <summary>
        /// 👎 '닫기' 버튼을 화면에 보여줄지 말지 결정해요. (기본값: true, 보여줌)
        /// false로 바꾸면 '닫기' 버튼이 사라져요.
        /// </summary>
        public bool ShowCloseButton { get; set; } = true;

        /// <summary>
        /// 🎨 모달 창의 '디자인 도면' 파일이 어디 있는지 알려주는 경로예요.
        /// Unity 에디터에서 만들어둔 프리팹(Prefab) 파일의 경로를 적어줘야 해요.
        /// 예: "Prefabs/UI/MyCustomModal"
        /// </summary>
        public string PrefabPath { get; private set; }

        /// <summary>
        /// 🧑‍🍳 ModalContent 레시피를 만드는 방법이에요. (생성자)
        /// 모달 창을 어떤 디자인으로 만들지 알려줘야 해요.
        /// </summary>
        /// <param name="prefabPath">사용할 모달 창 디자인(프리팹) 파일의 경로예요.</param>
        /// <example>
        /// <code>
        /// // "CommonModalPrefab" 디자인을 사용하는 레시피 만들기
        /// var content = new ModalContent("Prefabs/UI/CommonModalPrefab");
        /// content.Title = "안내";
        /// content.Message = "이것은 일반적인 안내 모달입니다.";
        /// </code>
        /// </example>
        public ModalContent(string prefabPath)
        {
            PrefabPath = prefabPath;
            // Title, Message 등 다른 텍스트 속성도 필요한 경우 여기서 기본 다국어 키를 사용하여 초기화할 수 있습니다.
            // 예: Title = LocalizationManager.Instance.GetString("default_modal_title");
        }        

        /// <summary>
        /// 🚀 모달 창이 화면에 나타나기 *직전*에 이 레시피가 할 일을 정해요. (비동기 작업 가능)
        /// 예를 들어, 모달에 필요한 데이터를 미리 불러오거나 특별한 준비를 할 수 있어요.
        /// `ModalView.OnOpen()` 보다 먼저 호출돼요.
        /// </summary>
        /// <example>
        /// <para>이 메서드를 상속받아서 특별한 준비 작업을 추가할 수 있어요:</para>
        /// <code>
        /// public class MySpecialModalContent : ModalContent
        /// {
        ///     public MySpecialModalContent(string prefabPath) : base(prefabPath) { }
        ///
        ///     public override async UniTask OnOpen()
        ///     {
        ///         await base.OnOpen(); // 부모 클래스의 OnOpen도 호출해주는 게 좋아요.
        ///         ULog.Debug("나만의 특별한 모달 내용 준비 시작!");
        ///         // 예: await LoadSomeDataForTheModal();
        ///         ULog.Debug("나만의 특별한 모달 내용 준비 완료!");
        ///     }
        /// }
        /// </code>
        /// </example>
        public virtual async UniTask OnOpen()
        {
            // 기본적으로는 아무것도 하지 않아요. 필요하면 상속받아서 내용을 채워주세요!
            //ULog.Debug($"[ModalContent] '{Title}' OnOpen called.");
            await UniTask.CompletedTask;
        }

        /// <summary>
        /// 🎬 모달 창이 화면에서 사라지기 *직전*에 이 레시피가 할 일을 정해요. (비동기 작업 가능)
        /// 예를 들어, 모달에서 사용했던 자원을 정리하거나 특별한 마무리를 할 수 있어요.
        /// `ModalView.OnClose()` 보다 먼저 호출돼요.
        /// </summary>
        /// <example>
        /// <para>이 메서드를 상속받아서 특별한 마무리 작업을 추가할 수 있어요:</para>
        /// <code>
        /// public class MySpecialModalContent : ModalContent
        /// {
        ///     public MySpecialModalContent(string prefabPath) : base(prefabPath) { }
        ///
        ///     // ... OnOpen 재정의 ...
        ///
        ///     public override async UniTask OnClose()
        ///     {
        ///         ULog.Debug("나만의 특별한 모달 내용 마무리 시작!");
        ///         // 예: await ReleaseSomeDataUsedInModal();
        ///         ULog.Debug("나만의 특별한 모달 내용 마무리 완료!");
        ///         await base.OnClose(); // 부모 클래스의 OnClose도 호출해주는 게 좋아요.
        ///     }
        /// }
        /// </code>
        /// </example>
        public virtual async UniTask OnClose()
        {
            // 기본적으로는 아무것도 하지 않아요. 필요하면 상속받아서 내용을 채워주세요!
            //ULog.Debug($"[ModalContent] '{Title}' OnClose called.");
            await UniTask.CompletedTask;
        }
    }
}