using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityGameFramework.Runtime;
using GameFramework;
using GameFramework.DataTable;
using GameFramework.Sound;
using GameFramework.Download;
using GameFramework.FileSystem;
using GameFramework.ObjectPool;
using GameFramework.Resource;
using System;
using DG.Tweening;
namespace MetaClient
{

    public class UICustom : UGuiForm
    {
        // Start is called before the first frame update
        [Header("初始界面")]
        public GameObject toolView;

        [Header("基础按钮界面")]
        public GameObject baseView;
        [Header("保存按钮")]
        public GameObject saveBtn;

        [Header("捏脸界面")]
        public GameObject nieLianView;


        [Header("身体界面")]
        public GameObject bodyView;

        [Header("自定义")]
        public GameObject ziDingYiBtn;
        [Header("衣服界面")]
        public GameObject clothView;

        [Header("左边界面")]
        public GameObject leftView;

        [Header("右边界面")]
        public GameObject rightView;

        //[Header("点击后生成的按钮列表")]
        //public GameObject buttonList;
        [Header("白底背景")]
        public GameObject whitebg;
        [Header("按钮预制体")]
        public GameObject buttonItem;

        [Header("滑块")]
        public Scrollbar scrollbar;


        [Header("颜色选择界面")]
        public GameObject colorView;
        [Header("调色版界面")]
        public GameObject tiaoSeBanView;

        // [Header("顺序")]
        private EButtonShunXu eButtonShunXu = EButtonShunXu.None;
        
        [Header("颜色演示预制体")]
        public GameObject colItem;


        public float tween_leftMax = 0;
        public float tween_leftMin = -250;

        public float tween_rightMin = 0;
        public float tween_rightMax = 223;

        private float tween_saveBtnMax = 119;
        private float tween_saveBtnMin = -108;

        private float tweenTime = 0.5f;
        //private float tweenTime = 10;
        //private float tweenLeastTime = 0;

        public bool isTween = false;
        [Header("选择界面分支")]
        [SerializeField]
        private ECustomStyple eCustomStyple = ECustomStyple.None;
        [Header("历史记录用于回退")]
        [SerializeField]
        private List<string> histroy;

        //用来判断是否是例如颜色框  调色板等额外的弹窗；
        private bool histroyextra;

        private int part = 0;
        private int id = -1;
        private GameObject nowPickOnImg=null;


        //[Header("接受到的数据")]
        //[SerializeField]
        private IDataTable<DRCustomBody> _bodydata;
        protected override void OnOpen(object userData)
        {

            base.OnOpen(userData);
            IDataTable<DRCustomBody> _data = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            _bodydata = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            
        }

        protected override void OnClose(bool isShutdown, object userData)
        {
            base.OnClose(isShutdown, userData);
        }


        public void ClickBotton(ECustomStyple eCustomStyple,int id,bool ziDingYi)
        {
            if (isTween)
            {
                return;
            }
            isTween = true;
            leftView.transform.DOLocalMoveX(tween_leftMin, tweenTime).SetEase(Ease.InOutBack).OnComplete(()=> {
                //whitebg.SetActive(bg);
               
                 ClickBtnFun(eCustomStyple,id,ziDingYi);
                leftView.transform.DOLocalMoveX(0, tweenTime).SetEase(Ease.InOutBack).OnComplete(() => {
                    isTween = false;
                    Debug.Log("222");
                });
            });
            Debug.Log("333");
            rightView.transform.DOLocalMoveX(tween_rightMax, tweenTime).SetEase(Ease.InOutBack).OnComplete(() => {
                rightView.transform.DOLocalMoveX(0, tweenTime).SetEase(Ease.InOutBack).OnComplete(() => {
                });
            });

        }


        public void TiaoSeViewOpenFun() {
            rightView.SetActive(false);
            colorView.SetActive(true);

        }
        public void TiaoSeBanOpenStyple(bool _bo)
        {
            colorView.SetActive(_bo);
            tiaoSeBanView.SetActive(!_bo);
            
        }

        //private void 








        /// <summary>
        /// 设置是否已在缓动
        /// </summary>
        public void SetTween(bool _bo) {
            isTween = _bo;
        }
        /// <summary>
        /// 获取是否缓动
        /// </summary>
        public bool GetTween()
        {
            return isTween;
        }
        public void HistoryAdd(string _str) {
            histroy.Add(_str);
        }


        /// <summary>
        /// 滑块改变
        /// </summary>
        public void ScrollValueChange()
        {
            //Debug.Log(scrollbar.value);
            GameEntry.Event.Fire(this, CustomRoleBodyEventArgs.Create(part, new Vector3(scrollbar.value, 0, 0)));
        }

        public void BackBtnFun()
        {
            if (histroyextra)
            {
                BackExtraFun();
                histroyextra = false;
                return;
            }
            switch (this.histroy.Count)
            {
                case 0:
                    Debug.Log("返回上一层");
                    break;
                case 1:
                    Debug.Log("返回选择捏脸/身体/服装");
                    histroy.RemoveAt(histroy.Count - 1);
                    Back_OneFun();
                    break;
                case 2:
                    Debug.Log("进入选择界面");
                    histroy.RemoveAt(histroy.Count - 1);
                    Back_TwoFun(true);
                    break;
                default:
                    Debug.Log("进入自定义或颜色");
                   // histroy.RemoveAt(histroy.Count - 1);
                    Back_ThreeFun();
                    histroy.RemoveAt(histroy.Count - 1);
                    break;

            }
        }
        void Back_OneFun() {
            ViewSetFalse();
            toolView.SetActive(true);
            //toolView.SetActive(true);
            //bodyView.SetActive(false);
            //nieLianView.SetActive(false);
            //clothView.SetActive(false);
        }

        void BackExtraFun()
        {
            rightView.SetActive(true);
            scrollbar.gameObject.SetActive(false);
        }
        void ViewSetFalse()
        {
            toolView.SetActive(false);
            bodyView.SetActive(false);
            nieLianView.SetActive(false);
            clothView.SetActive(false);
        }

        void BackView_Extra(GameObject _obj,bool _bo) {
            ViewSetFalse();
           _obj.SetActive(_bo);
            ViewSetChildTrue(_obj,_bo);
        }

        void ViewSetChildTrue(GameObject _obj,bool _bo)
        {
            _obj.transform.GetChild(0).gameObject.SetActive(_bo);
            _obj.transform.GetChild(0).gameObject.SetActive(_bo);
            _obj.transform.GetChild(2).gameObject.SetActive(!_bo);
        }
        void Back_TwoFun(bool _bo)
        {
           // int _choose = int.Parse(histroy[1]);
           // switch ((ECustomStyple)_choose)
           switch(eCustomStyple)
            {
                case ECustomStyple.Body:
                    BackView_Extra(bodyView,_bo);
                    break;
                case ECustomStyple.Cloth:
                    BackView_Extra(clothView, _bo);
                    break;
                case ECustomStyple.None:
                    break;
                case ECustomStyple.NieLian:
                    BackView_Extra(nieLianView, _bo);
                    break;
            }
            //toolView.SetActive(true);
            //bodyView.SetActive(false);
            //nieLianView.SetActive(false);
            //clothView.SetActive(false);
        }
        void Back_ThreeFun()
        {
            string[] _strArrary = histroy[histroy.Count - 1].Split(',');
            if (_strArrary[0] == "Color")
            {
                colorView.SetActive(false);
                rightView.SetActive(true);
            }
            else if (_strArrary[0] == "ziDingyi")
            {
                int _chooseId = int.Parse(_strArrary[1]);
                ClickBtnFun(eCustomStyple, _chooseId, false);
            }
            else
            {
                Debug.Log("缺少当前情况需要添加>>>>");
            }
            //toolView.SetActive(true);
            //bodyView.SetActive(false);
            //nieLianView.SetActive(false);
            //clothView.SetActive(false);
        }


        public void PickOnButton(GameObject _obj,int _id) {
            if (_obj.transform.childCount <= 0)
            {
                return;
            }
            GameObject _nowPickOnImg = _obj.transform.GetChild(0).gameObject;
            
            if (nowPickOnImg==null)
            {
              
                nowPickOnImg = _nowPickOnImg;
                nowPickOnImg.SetActive(true);
            }
            else
            {
                nowPickOnImg.SetActive(false);
                if (_id != id)
                {
                    id = _id;
                    nowPickOnImg = _nowPickOnImg;
                    _nowPickOnImg.SetActive(true);
                }
                else
                {
                    nowPickOnImg = _nowPickOnImg;
                    _nowPickOnImg.SetActive(!_nowPickOnImg.activeSelf);
                }
            }
            scrollbar.gameObject.SetActive(nowPickOnImg.activeSelf);
        }


        /// <summary>
        /// 修改滑块
        /// </summary>
        public void SetValue(int _part,ECustomStyple eCustomStyple)
        {

            //scrollbar.value = _value;
            part = _part;
            scrollbar.value = CustomManager.Instance.GetBodyBoneValue(part);
        }
        /// <summary>
        /// 获得滑块值
        /// </summary>
        public float GetValue()
        {
            return scrollbar.value;
        }

        /// <summary>
        /// 按钮点击事件
        /// </summary>
        public void ClickBtnFun(ECustomStyple eCustomStyple,int id,bool zidingyi) {
            //if (isTween)
            //{
            //    return;
            //}
            whitebg.SetActive(true);
            scrollbar.gameObject.SetActive(false);
            this.eCustomStyple = eCustomStyple;

         
            //ECustomStyple _eCustomStyple = (ECustomStyple)int.Parse(_objects[0].ToString());
            switch (eCustomStyple)
            {
                case ECustomStyple.None:
                    break;
                case ECustomStyple.NieLian:
                    GameObject _nieLianList = nieLianView.transform.GetChild(0).gameObject;
                    _nieLianList.SetActive(false);
                    GameObject _nieLianXX = nieLianView.transform.GetChild(2).gameObject;
                    _nieLianXX.SetActive(true);
                    //if (!zidingyi)
                    //{
                    //    ZiDingYiNeiLian(eCustomStyple, id, _nieLianXX.transform.GetChild(0).gameObject);
                    //    return;
                    //}
                    CreateNieLianImg(id, zidingyi);
                    break;
                case ECustomStyple.Body:
                    GameObject _bodyList = bodyView.transform.GetChild(0).gameObject;
                    _bodyList.SetActive(false);
                    GameObject _bodyListXX =bodyView.transform.GetChild(2).gameObject;
                    _bodyListXX.SetActive(true);
                    //if (!zidingyi)
                    //{
                    //    ZiDingYiBody(eCustomStyple, id, _bodyListXX.transform.GetChild(0).gameObject);
                    //    return;
                    //}
                    CreateBodyImg(id, zidingyi);
                    break;
                case ECustomStyple.Cloth:
                    GameObject _clothList = clothView.transform.GetChild(0).gameObject;
                    _clothList.SetActive(false);
                    GameObject _clothListXX = clothView.transform.GetChild(2).gameObject;
                    _clothListXX.SetActive(true);
                    //if (!zidingyi)
                    //{
                    //    ZiDingYiCloth(eCustomStyple, id, _clothListXX.transform.GetChild(0).gameObject);
                    //    return;
                    //}
                    CreateClothImg(id, zidingyi);
                    break;
            }
        }
        //public Action ActionFun() {

        //    return null;
        //}

        private void RemoveAllChildren(GameObject parent)
        {
            Transform transform;
            for (int i = 0; i < parent.transform.childCount; i++)
            {
                transform = parent.transform.GetChild(i);
                GameObject.Destroy(transform.gameObject);
            }
        }

        //public void ZiDingYiNeiLian(ECustomStyple eCustomStyple, int id,GameObject _objPar) {
        //    RemoveAllChildren(bodyView.transform.GetChild(2).GetChild(0).gameObject);
        //    GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
        //    _obj.transform.SetParent(_objPar.transform);
        //    UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
        //    _uICustomBtn.id = id;
        //    _uICustomBtn.eCustomStyple = eCustomStyple;
        //    _obj.SetActive(true);

        //}
        //public void ZiDingYiBody(ECustomStyple eCustomStyple, int id, GameObject _objPar)
        //{
        //    RemoveAllChildren(bodyView.transform.GetChild(2).GetChild(0).gameObject);
        //    GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
        //    _obj.transform.SetParent(_objPar.transform);
        //    UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
        //    _uICustomBtn.id = id;
        //    _uICustomBtn.eCustomStyple = eCustomStyple;
        //    _obj.SetActive(true);


        //}
        //public void ZiDingYiCloth(ECustomStyple eCustomStyple, int id, GameObject _objPar)
        //{
        //    RemoveAllChildren(bodyView.transform.GetChild(2).GetChild(0).gameObject);
        //    GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
        //    _obj.transform.SetParent(_objPar.transform);
        //    UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
        //    _uICustomBtn.id = id;
        //    _uICustomBtn.eCustomStyple = eCustomStyple;
        //    _obj.SetActive(true);


        //}


        public void CreateNieLianImg(int parentid, bool ziDingYi)
        {




            GameObject _objPar = bodyView.transform.GetChild(2).GetChild(0).gameObject;
            RemoveAllChildren(_objPar);
            //等有捏脸表时改为捏脸
            IDataTable<DRCustomBody> _data = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            _bodydata = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            int cengji = ziDingYi ?1:0;
            if (!ziDingYi)
            {

                CreateZDYFun(parentid, _objPar);

                //GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
                //_obj.transform.SetParent(_objPar.transform);
                //UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
                //ChangeUICustom(_uICustomBtn, parentid, eCustomStyple);


                //_uICustomBtn.id =parentid;
                //_uICustomBtn.eCustomStyple = eCustomStyple;
                //_obj.SetActive(true);
            }

            DRCustomBody[] dRCustomBodies = _bodydata.GetAllDataRows();
            for (int i = 0; i < dRCustomBodies.Length; i++)
            {
                Debug.Log(dRCustomBodies[i].Id);
                if (dRCustomBodies[i].ParentStyple == parentid&&dRCustomBodies[i].Cengji==cengji)
                {
                    CreateButtonFun(dRCustomBodies[i].Icon, dRCustomBodies[i].Part, dRCustomBodies[i].Name, _objPar, dRCustomBodies[i].Id, dRCustomBodies[i].ButtonStyple, ECustomStyple.Body);
                }
            }
          
             ChangeListBotton(_objPar);
        }
        public void CreateClothImg(int parentid,bool ziDingYi)
        {

            GameObject _objPar = bodyView.transform.GetChild(2).GetChild(0).gameObject;
            RemoveAllChildren(_objPar);
            //等有服装时改为服装
            IDataTable<DRCustomBody> _data = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            _bodydata = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            int cengji = ziDingYi ?1:0;
            if (!ziDingYi)
            {

                CreateZDYFun(parentid, _objPar);

                //GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
                //_obj.transform.SetParent(_objPar.transform);
                //UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
                //ChangeUICustom(_uICustomBtn, parentid, eCustomStyple);


                //_uICustomBtn.id = parentid;
                //_uICustomBtn.eCustomStyple = eCustomStyple;
                //_obj.SetActive(true);

            }
            DRCustomBody[] dRCustomBodies = _bodydata.GetAllDataRows();
            for (int i = 0; i < dRCustomBodies.Length; i++)
            {
                Debug.Log(dRCustomBodies[i].Id);
                if (dRCustomBodies[i].ParentStyple == parentid && dRCustomBodies[i].Cengji == cengji)
                {
                    CreateButtonFun(dRCustomBodies[i].Icon, dRCustomBodies[i].Part, dRCustomBodies[i].Name, _objPar, dRCustomBodies[i].Id, dRCustomBodies[i].ButtonStyple, ECustomStyple.Body);
                }
            }
            ChangeListBotton(_objPar);
        }

        private void CreateZDYFun(int parentid,GameObject _objPar)
        {
            GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
            _obj.transform.SetParent(_objPar.transform);
            UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
            ChangeUICustom(_uICustomBtn, parentid, eCustomStyple);
        }

        public void ChangeUICustom(UICustomBtn uICustomBtn,int id, ECustomStyple eCustomStyple) 
        {
            uICustomBtn.id = id;
            uICustomBtn.eCustomStyple = eCustomStyple;
            uICustomBtn.gameObject.SetActive(true);
        }








        public void CreateBodyImg(int parentid,bool ziDingYi) {
            GameObject _objPar = bodyView.transform.GetChild(2).GetChild(0).gameObject;
            RemoveAllChildren(_objPar);
            IDataTable<DRCustomBody> _data = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            _bodydata = GameEntry.DataTable.GetDataTable<DRCustomBody>();
            int cengji = ziDingYi ?1:0;
            if (!ziDingYi)
            {

                CreateZDYFun(parentid, _objPar);


                //GameObject _obj = GameObject.Instantiate(ziDingYiBtn);
                //_obj.transform.SetParent(_objPar.transform);
                //UICustomBtn _uICustomBtn = _obj.GetComponent<UICustomBtn>();
                //ChangeUICustom(_uICustomBtn, parentid, eCustomStyple);


                //_uICustomBtn.id = parentid;
                //_uICustomBtn.eCustomStyple = eCustomStyple;
                //_obj.SetActive(true);

            }
            DRCustomBody[] dRCustomBodies = _bodydata.GetAllDataRows();
            for (int i = 0; i < dRCustomBodies.Length; i++)
            {
                Debug.Log(dRCustomBodies[i].Id);
                if (dRCustomBodies[i].ParentStyple == parentid && dRCustomBodies[i].Cengji == cengji)
                {
                    CreateButtonFun(dRCustomBodies[i].Icon, dRCustomBodies[i].Part, dRCustomBodies[i].Name, _objPar, dRCustomBodies[i].Id, dRCustomBodies[i].ButtonStyple, ECustomStyple.Body);
                }
            }
             ChangeListBotton(_objPar);
        }


        /// <summary>
        /// 改变列表长短
        /// </summary>
        public void ChangeListBotton(GameObject _obj) {
            //Debug.Log("改变列表"+ _obj.transform.childCount+"");
            
            float _x = _obj.GetComponent<RectTransform>().offsetMin.x;
            int _childNum = _obj.transform.childCount;
            float _y = _childNum > 7 ? -240 * (_childNum - 7) : 0;
            _obj.GetComponent<RectTransform>().offsetMax = new Vector2(_x, 0);
            _obj.GetComponent<RectTransform>().offsetMin = new Vector2(_x, _y);
        }









        //private IEnumerator Tween(Action _action) {
        //    for (int i = 0; i < 100; i++)
        //    {
        //        float _value = i / 100;
        //        float _right=Mathf.Lerp(tween_rightMax, tween_rightMin, _value);
        //        float _left= Mathf.Lerp(tween_leftMix, tween_rightMax, _value);
        //        clothView.GetComponent<RectTransform>().SetPositionX(_right);
        //        toolView.GetComponent<RectTransform>().SetPositionX(_right);
        //        bodyView.GetComponent<RectTransform>().SetPositionX(_right);
        //        nieLianView.GetComponent<RectTransform>().SetPositionX(_right);
        //        baseView.GetComponent<RectTransform>().SetPositionX(_left);
        //    }
        //    yield return null;
        //}








        protected override void OnUpdate(float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(elapseSeconds, realElapseSeconds);
        }

        //private void CreateNieLianFun(object[] _objects) {
        //    ENieLianStyple _eNieLianStyple = (ENieLianStyple)int.Parse(_objects[1].ToString());
        //    switch (_eNieLianStyple)
        //    {
        //        case ENieLianStyple.faxing:
        //            break;
        //        case ENieLianStyple.lianxing:
        //            break;
        //        case ENieLianStyple.yankuang:
        //            break;
        //        case ENieLianStyple.tongkong:
        //            break;
        //        case ENieLianStyple.meimao:
        //            break;
        //        case ENieLianStyple.bizi:
        //            break;
        //        case ENieLianStyple.erduo:
        //            break;
        //        case ENieLianStyple.zuiba:
        //            break;
        //        case ENieLianStyple.fuse:
        //            break;
        //    }
        //    //switch()
        //}






        private void CreateButtonFun(string path,int _part,string _name, GameObject _parent,int _id,int buttonstyple,ECustomStyple eCustomStyple) {
            //Debug.Log(path);
           // Debug.Log(_parent);
            path = "CustomRole/" + path;
            GameEntry.Resource.LoadAsset(AssetUtility.GetUISpriteAsset(path), new LoadAssetCallbacks(
                (assetName, asset, duration, userData) =>
                {
                   // Debug.Log(path);
                   // Debug.Log(_parent);

                    Texture2D tex = (Texture2D)asset;
                    var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
                    GameObject _obj = GameObject.Instantiate(buttonItem);
                    Image _objImg = _obj.transform.GetComponent<Image>();
                    _obj.SetActive(true);
                    _objImg.sprite = sprite;
                    _obj.name = part+"";
                    _obj.transform.SetParent(_parent.transform);
                    UICustomBtn uICustomBtn = _obj.GetComponent<UICustomBtn>();
                    uICustomBtn.id = _id;
                    uICustomBtn.eButtonStyple = (EButtonStyple)buttonstyple;
                    uICustomBtn.eCustomStyple = eCustomStyple;
                    uICustomBtn.isCreate = false;
                    uICustomBtn.part = _part;

                    //GameObject 
                    //img.sprite = sprite;
                    //if (nativeSize)
                    //{
                    //    img.SetNativeSize();
                    //}
                    ChangeListBotton(_parent);
                }));
        }


        //public void NieLian() { 
        
        //}


        public void ClickFaceChangeBtn()
        {
            GameEntry.Event.Fire(this, CustomRoleFaceEventArgs.Create(EditableFacePart.eye, new Vector3(1, 0, 0)));
        }
    }
    public enum ECustomStyple
    {
        None,
        NieLian,
        Body,
        Cloth
    }
    public enum EButtonStyple
    {
        Button,
        Scroll,
        TiaoSe,
        NorButton,
        Back
    }
    public enum ENieLianStyple {
        None,
        faxing,
        lianxing,
        yankuang,
        tongkong,
        meimao,
        bizi,
        erduo,
        zuiba,
        fuse
    }
    public enum EButtonShunXu {
    
        None,
        First,
        Second,
        Third

    }
    public enum ETSStyple {
    None,
    ViewOpen,
    Close,
    Sure,
    Open

    }




}
