using FairyGUI;
using System.Collections;
using UnityEngine;
namespace GFGGame
{
    /// 
    /// 视图基类,界面不可以直接继承
    /// 
    public class UIView : IUIView
    {
        private string _descFilePath;
        private EnumViewAnimationType _viewAnimationType = EnumViewAnimationType.None;
        /// 
        /// 打开视图传递的参数
        /// 
        public object viewData { get; set; }
        /// 
        /// 设置视图组件
        /// 
        public virtual GComponent viewCom { get; set; }
        /// 
        /// 设置是否全屏自适应
        /// 
        public bool isfullScreen { get; set; }
        /// 
        /// FairyGUI包名
        /// 
        protected string packageName
        {
            set
            {
                _descFilePath = ResPathUtil.GetUIPackagePath(value);
                GFGUIPackage.AddPackage(_descFilePath);
            }
        }
        /// 
        /// 是否显示中
        /// 
        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)
            {
                GFGUIPackage.RemovePackage(_descFilePath);
            }
            _descFilePath = null;
            viewData = null;
        }
        virtual protected void Init()
        {
        }
        virtual protected void OnInit()
        {
        }
        /// 
        /// 界面打开状态刷新界面
        /// 
        virtual public void Refresh()
        {
            object temp = viewData;
            this.OnHide();
            this.viewData = temp;
            this.OnShown();
        }
        public virtual void Show()
        {
        }
        public virtual void Hide()
        {
            DoHideAnimation();
        }
        virtual protected void OnShown()
        {
            if (isfullScreen)
            {
                MakeFullScreen(viewCom);
            }
            if (GuideController.IsGuide())
            {
                Timers.inst.AddUpdate(UpdateToCheckGuide);
            }
        }
        virtual protected void OnHide()
        {
            viewData = null;
            Timers.inst.Remove(UpdateToCheckGuide);
            TryCompleteGuide();
        }
        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)
        {
            ui.MakeFullScreen();
            ui.AddRelation(GRoot.inst, RelationType.Size);
        }
        void __addedToStage()
        {
            DoShowAnimation();
        }
        void __removeFromStage()
        {
            OnHide();
        }
    }
}