using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

namespace WS
{
    ///<summary>消息框类型</summary>
    public enum MessagerType
    {
        Error,

        Default,
    }

    ///<summary>消息框控制器</summary>
    public class MessagerContorller : Controller<MessagerView, MessagerModel>
    {
        /// <summary>打开消息框</summary>
        /// <param name="type">面板类型</param>
        /// <param name="messager">消息</param>
        /// <param name="defineName">第一个按钮名称</param>
        /// <param name="onDefine">第一个按钮回调</param>
        /// <param name="cancelName">第二个按钮名称 (如果第二个按钮名称为空,不会显示)</param>
        /// <param name="onCancel">第二个按钮回调</param>Async
        public static void OpenMessageView(MessagerType type, string messager, string defineName = "确定", UnityAction onDefine = null, string cancelName = "", UnityAction onCancel = null)
        {
            MessagerContorller contorller = FacadeComponent.Instance.CreateController<MessagerContorller>(false);
            contorller.OpenView();
            contorller.SetViewAndModel(type, messager, defineName, onDefine, cancelName, onCancel);
        }

        /// <summary>打开消息框</summary>
        /// <param name="clone">克隆体</param>
        /// <param name="type">面板类型</param>
        /// <param name="messager">消息</param>
        /// <param name="defineName">第一个按钮名称</param>
        /// <param name="onDefine">第一个按钮回调</param>
        /// <param name="cancelName">第二个按钮名称 (如果第二个按钮名称为空,不会显示)</param>
        /// <param name="onCancel">第二个按钮回调</param>
        public static void OpenMessageView(string clone, MessagerType type, string messager, string defineName = "确定", UnityAction onDefine = null, string cancelName = "", UnityAction onCancel = null)
        {
            MessagerContorller contorller = FacadeComponent.Instance.CreateController<MessagerContorller>(false);
            contorller.OpenView(clone);
            contorller.SetViewAndModel(type, messager, defineName, onDefine, cancelName, onCancel);
        }

        /// <summary>打开消息框</summary>
        /// <param name="showMode">显示在什么类型的Canvas上</param>
        /// <param name="type">面板类型</param>
        /// <param name="messager">消息</param>
        /// <param name="defineName">第一个按钮名称</param>
        /// <param name="onDefine">第一个按钮回调</param>
        /// <param name="cancelName">第二个按钮名称 (如果第二个按钮名称为空,不会显示)</param>
        /// <param name="onCancel">第二个按钮回调</param>
        public static void OpenMessageView(ViewShowModeType showMode, MessagerType type, string messager, string defineName = "确定", UnityAction onDefine = null, string cancelName = "", UnityAction onCancel = null)
        {
            MessagerContorller contorller = FacadeComponent.Instance.CreateController<MessagerContorller>(false);
            contorller.OpenView(showMode);
            contorller.SetViewAndModel(type, messager, defineName, onDefine, cancelName, onCancel);
        }

        /// <summary>打开消息框</summary>
        /// <param name="showMode">显示在什么类型的Canvas上</param>
        /// <param name="clone">克隆体</param>
        /// <param name="type">面板类型</param>
        /// <param name="messager">消息</param>
        /// <param name="defineName">第一个按钮名称</param>
        /// <param name="onDefine">第一个按钮回调</param>
        /// <param name="cancelName">第二个按钮名称 (如果第二个按钮名称为空,不会显示)</param>
        /// <param name="onCancel">第二个按钮回调</param>
        public static void OpenMessageView(ViewShowModeType showMode, string clone, MessagerType type, string messager, string defineName = "确定", UnityAction onDefine = null, string cancelName = "", UnityAction onCancel = null)
        {
            MessagerContorller contorller = FacadeComponent.Instance.CreateController<MessagerContorller>(false);
            contorller.OpenView(showMode, clone);
            contorller.SetViewAndModel(type, messager, defineName, onDefine, cancelName, onCancel);
        }

        ///<summary>第一个按钮回调</summary>
        private UnityAction OnDefineCallback;
        ///<summary>第二个按钮回调</summary>
        private UnityAction OnCancelCallback;

        ///<summary>绑定View&Model</summary>
        protected override void BindingViewModel()
        {
            _Model.Bind(_View.M_Error_Text, _Model.Message);
            _Model.Bind(_View.M_Default_Text, _Model.Message);
            _Model.Bind(_View.Define_But, OnDefine);
            _Model.Bind(_View.Cancel_But, OnCancel);
            _Model.Bind(_View.B_Define_Text, _Model.ButDefineText);
            _Model.Bind(_View.B_Cancel_Text, _Model.ButCancelText);
        }

        ///<summary>第一个按钮回调绑定</summary>
        private void OnDefine()
        {
            OnDefineCallback?.Invoke();
            CloseView();
        }

        ///<summary>第二个按钮回调绑定</summary>
        private void OnCancel()
        {
            OnCancelCallback?.Invoke();
            CloseView();
        }

        /// <summary>设置消息框</summary>
        /// <param name="type">面板类型</param>
        /// <param name="messager">消息</param>
        /// <param name="defineName">第一个按钮名称</param>
        /// <param name="onDefine">第一个按钮回调</param>
        /// <param name="cancelName">第二个按钮名称 (如果第二个按钮名称为空,不会显示)</param>
        /// <param name="onCancel">第二个按钮回调</param>
        public void SetViewAndModel(MessagerType type, string messager, string defineName, UnityAction onDefine, string cancelName, UnityAction onCancel)
        {
            //是否是默认面板 
            bool panelactive = type == MessagerType.Default ? true : false;
            //是否是单个Button
            bool butactive = string.IsNullOrEmpty(cancelName);
            _Model.Message.Value = messager;
            _Model.ButDefineText.Value = defineName;
            OnDefineCallback = onDefine;
            if (!butactive)
            {
                OnCancelCallback = onCancel;
                _Model.ButCancelText.Value = cancelName;
            }
            _View.MessageDefault.SetActive(panelactive);
            _View.MessageError.SetActive(!panelactive);
            _View.Cancel_But.gameObject.SetActive(!butactive);
            if (butactive)
                _View.Define_But.transform.localPosition = new Vector3(0, -180, 0);
            else
                _View.Define_But.transform.localPosition = new Vector3(-220, -180, 0);
        }

        public override void Dispose()
        {
            base.Dispose();
            OnDefineCallback = null;
            OnCancelCallback = null;
        }
    }

    ///<summary>消息框View</summary>
    public class MessagerView : View
    {
        ///<summary>错误面板</summary>
        public GameObject MessageError;
        ///<summary>错误面板文本</summary>
        public Text M_Error_Text;
        ///<summary>普通面板</summary>
        public GameObject MessageDefault;
        ///<summary>普通面板文本</summary>
        public Text M_Default_Text;
        ///<summary>确认按钮</summary>
        public Button Define_But;
        ///<summary>确认按钮文本</summary>
        public Text B_Define_Text;
        ///<summary>取消按钮</summary>
        public Button Cancel_But;
        ///<summary>取消按钮文本</summary>
        public Text B_Cancel_Text;

        public override void LoadInit()
        {
            Group = ViewGroup.HUD;
            ReferenceCollector rc = UIGameObject.GetComponent<ReferenceCollector>();
            MessageError = rc.Get<GameObject>("MessageError");
            M_Error_Text = rc.GetComponent<Text>("M_Error_Text");
            MessageDefault = rc.Get<GameObject>("MessageDefault");
            M_Default_Text = rc.GetComponent<Text>("M_Default_Text");
            Define_But = rc.GetComponent<Button>("Define_But");
            B_Define_Text = rc.GetComponent<Text>("B_Define_Text");
            Cancel_But = rc.GetComponent<Button>("Cancel_But");
            B_Cancel_Text = rc.GetComponent<Text>("B_Cancel_Text");
        }
    }

    ///<summary>消息框Model</summary>
    public class MessagerModel : Model
    {
        ///<summary>消息</summary>
        public BindableProperty<string> Message;
        ///<summary>Define按钮名称</summary>
        public BindableProperty<string> ButDefineText;
        ///<summary>Cancel按钮名称</summary>
        public BindableProperty<string> ButCancelText;

        public override void InitProperty()
        {
            Message = CreateProperty<string>();
            ButDefineText = CreateProperty<string>();
            ButCancelText = CreateProperty<string>();
        }
    }
}