using ET;
using FairyGUI;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace GFGGame
{
    /// 
    /// 视图基类,界面不可以直接继承
    /// 
    public class UIView : IUIView
    {
        private string _descFilePath;
        private EnumViewAnimationType _viewAnimationType = EnumViewAnimationType.None;
        /// 
        /// 打开视图传递的参数
        /// 
        public object viewData { get; set; }
        public string viewName { get; set; }
        /// 
        /// 设置视图组件
        /// 
        public virtual GComponent viewCom { get; set; }
        /// 
        /// 设置是否全屏自适应
        /// 
        public bool isfullScreen { get; set; }
        /// 
        /// 设置是否可以返回界面
        /// 
        public bool isReturnView { get; set; }
        /// 
        /// 设置是否可以返回窗口
        /// 
        public bool isReturnWindow { get; set; }
        /// 
        /// 设置返回界面是否刷新
        /// 
        public bool backRefresh { get; set; }
        /// 
        /// FairyGUI包名
        /// 
        public string packageName
        {
            get
            {
                return _descFilePath;
            }
            set
            {
                _descFilePath = ResPathUtil.GetUIPackagePath(value);
                GFGUIPackage.AddPackage(_descFilePath);
            }
        }
        /// 
        /// 界面关闭时间
        /// 
        /// 
        public long closeTime { get; set; }
        /// 
        /// 是否显示中
        /// 
        public bool isShowing
        {
            get { return viewCom != null && viewCom.onStage; }
        }
        /// 
        /// 设置视图显示和隐藏的动画类型
        /// 
        protected EnumViewAnimationType viewAnimationType
        {
            set
            {
                _viewAnimationType = value;
            }
        }
        public UIView()
        {
            //
            Init();
            OnInit();
            if (viewCom != null)
            {
                viewCom.onAddedToStage.Add(__addedToStage);
                viewCom.onRemovedFromStage.Add(__removeFromStage);
            }
        }
        public virtual void Dispose()
        {
            if (viewCom != null)
            {
                viewCom.RemoveFromParent();
                viewCom.Dispose();
                viewCom = null;
            }
            if (_descFilePath != null)
            {
                if (packageName != ResPathUtil.GetUIPackagePath("CommonGame") && packageName != ResPathUtil.GetUIPackagePath("Common") && packageName != ResPathUtil.GetUIPackagePath("Main"))
                {
                    GFGUIPackage.ReleasePackage(_descFilePath);
                } //这几个包不释放
            }
            _descFilePath = null;
            viewData = null;
            ViewManager.ClearUIView(viewName);
        }
        virtual protected void Init()
        {
        }
        virtual protected void OnInit()
        {
        }
        /// 
        /// 界面打开状态刷新界面
        /// 
        virtual public void Refresh()
        {
            object temp = viewData;
            this.OnHide();
            this.viewData = temp;
            this.BringToFront();
            this.OnShown();
        }
        public virtual void Show()
        {
        }
        virtual protected void BringToFront()
        {
        }
        public virtual void Hide()
        {
            // UIPackageManager.Instance.RemovePackageView(_descFilePath, viewName);
            // UIPackageManager.Instance.AddCloseTime(_descFilePath);
            closeTime = TimeHelper.ClientNowSeconds();
            DoHideAnimation();
            ViewManager.HideWin(this.viewName);
            EventAgent.DispatchEvent(ConstMessage.VIEW_CLOSED);
        }
        virtual protected void OnShown()
        {
            if (isfullScreen)
            {
                MakeFullScreen(viewCom);
            }
            AddEventListener();
            // if (GuideController.IsGuide())
            // {
            //     Timers.inst.AddUpdate(UpdateToCheckGuide);
            // }
        }
        virtual protected void OnHide()
        {
            viewData = null;
            RemoveEventListener();
            // Timers.inst.Remove(UpdateToCheckGuide);
            TryCompleteGuide();
        }
        virtual protected void RemoveEventListener()
        {
        }
        virtual protected void AddEventListener()
        {
        }
        virtual protected void UpdateToCheckGuide(object param)
        {
        }
        virtual protected void TryCompleteGuide()
        {
        }
        protected virtual void DoShowAnimation()
        {
            OnShown();
            switch (_viewAnimationType)
            {
                case EnumViewAnimationType.ZOOM_CENTER:
                    ViewAnimationFactory.ZoomInCenter(this.viewCom);
                    break;
                default:
                    break;
            }
        }
        protected virtual void DoHideAnimation()
        {
            switch (_viewAnimationType)
            {
                case EnumViewAnimationType.ZOOM_CENTER:
                    ViewAnimationFactory.ZoomOutCenter(this.viewCom, this.OnDoHideAnimationCompleted);
                    break;
                default:
                    this.OnDoHideAnimationCompleted();
                    break;
            }
        }
        protected virtual void OnDoHideAnimationCompleted()
        {
            if (this.viewCom != null)
            {
                this.viewCom.RemoveFromParent();
            }
        }
        private void MakeFullScreen(GObject ui)
        {
            // 摘星界面特殊处理
            if (viewName == "LuckyBoxView")
            {
                ui.MakeFullScreen();
            }
            else
            {
                MakeUIFullScreen(ui);
            }
            
            ui.AddRelation(GRoot.inst, RelationType.Size);
        }
        private bool _adaptFinished = false;
        public void MakeUIFullScreen(GObject ui)
        {
            if (_adaptFinished)
            {
                return;
            }
            //这里做了最大宽度适配
            float targetWidth;
            float maxAspectRatio = 1080 * 1.0f / 1920;
            if (Screen.width * 1.0f / Screen.height > maxAspectRatio)
            {
                targetWidth = GRoot.inst.height * maxAspectRatio;
                ui.Center();
            }
            else
            {
                targetWidth = GRoot.inst.width;
            }
            GameObject uiObj = viewCom.displayObject.gameObject;
            List listTopImg = new List();
            float offsetY = ViewGlobal.GetRealTopOffset();
            // 处理全屏显示的背景图/遮罩
            List list = ViewGlobal.FindAllGLoaderInTrans(uiObj.transform);
            for (int i = 0; i < list.Count; i++)
            {
                GameObject bg = list[i].gameObject;
                DisplayObjectInfo bgInfo = bg.GetComponent();
                GObject obj = GRoot.inst.DisplayObjectToGObject(bgInfo.displayObject);
                if (obj != null)
                {
                    if (ViewGlobal.IsFullScreenPic(obj.name) && obj.height >= 1920)
                    {
                        obj.AddRelation(ui, RelationType.Center_Center);
                        obj.SetSize(1080, 2400);
                        obj.SetXY(obj.x, obj.y - offsetY / 2);
                    }
                    else if (obj.name.Contains("Top_img"))
                    {
                        listTopImg.Add(obj);
                    }
                }
            }
            // 保存未适配时,不需要改变位置的UI的信息(适配部分存在拉伸效果的UI)
            ui.SetSize(targetWidth, GRoot.inst.height);
            List heightList = new List();
            for (int i = 0; i < listTopImg.Count; i++)
            {
                listTopImg[i].RemoveRelation(ui, RelationType.Center_Center);
                heightList.Add(listTopImg[i].height);
            }
            // UI整体高度缩放
            ui.SetSize(targetWidth, ViewGlobal.GetUIHeight());
            // UI整体下移动
            ui.SetXY(ui.x, offsetY);
            // 还原不需要适配的UI
            for (int i = 0; i < listTopImg.Count; i++)
            {
                listTopImg[i].SetSize(listTopImg[i].width, heightList[i] + offsetY * 2);
                listTopImg[i].SetXY(listTopImg[i].x, listTopImg[i].y - offsetY);
            }
            _adaptFinished = true;
        }
        void __addedToStage()
        {
            DoShowAnimation();
        }
        void __removeFromStage()
        {
            OnHide();
            if (_descFilePath == ResPathUtil.GetUIPackagePath("Login") || _descFilePath == ResPathUtil.GetUIPackagePath("Loading") || _descFilePath == ResPathUtil.GetUIPackagePath("CreateRole"))//这几个界面关闭后立即释放
            {
                Dispose();
            }
        }
    }
}