using Cysharp.Threading.Tasks;
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using UnityEngine;

public class CharacterManager : MonoBehaviour
{
    public static CharacterManager Inst;
    public CharacterRender selfRender;
    /// <summary>�Ѵ�������Ʒ��Ϣ</summary>
    public List<Good> WornPackageItems = new List<Good>();
    /// <summary>��ʱ�Ѵ�������Ʒ��Ϣ</summary>
    public List<Good> TempWornPackageItems = new List<Good>();

    public static Camera mainCam;
    public static Camera UICam;
    void Start()
    {
        Inst=this;

        mainCam = GameObject.Find("Camera").GetComponent<Camera>();
        UICam = GameObject.Find("UICamera").GetComponent<Camera>();
    }

    /// <summary>
    /// ƥ����ҵ�Character
    /// </summary>
    /// <param name="ob"></param>
    public void MatchCharacterRender(CharacterRender cr)
    {
        if (cr) selfRender = cr;
    }

    /// <summary>
    /// ����ƥ�����Ť���ͻ�װ����
    /// </summary>
    /// <param name="cr"></param>
    public async void CharacterClothReMatch(CharacterRender cr)
    {
        if (selfRender.dressRenders.Count>0)
        {
            foreach (var item in selfRender.dressRenders)
            {
                await ChangePlayerTex(cr, item.Value.good);
                //Debug.Log(cr.gameObject.name+"/"+item.Value.good.name);
            }
        }
    }

    /// <summary>
    /// ����һ�װ���ݱ��浽����Json
    /// </summary>
    public void GoodsSaveToFile()
    {
        List<Good> goods = new List<Good>();
        foreach(var item in selfRender.dressRenders)
        {
            goods.Add(item.Value.good);
        }
        string jsonStr=JsonMapper.ToJson(goods);
        File.WriteAllText(Application.persistentDataPath + "/PlayerGoods.json", jsonStr);
    }

    /// <summary>
    /// ����һ�װ���ݴӱ���Json��ȡ
    /// </summary>
    /// <param name="cr"></param>
    public async void GoodsReadFromFile(CharacterRender cr)
    {
        string jsonStr = File.ReadAllText(Application.persistentDataPath + "/PlayerGoods.json");
        List<Good> goods = JsonMapper.ToObject<List<Good>>(jsonStr);
        foreach(var item in goods)
        {
            await ChangePlayerTex(cr, item);
        }
    }
    public async UniTask ChangePlayerTex (CharacterRender cr, Good config)
    {
        //Debug.Log(config.id);
        switch (int.Parse(config.assetsType))
        {
            case 1:
                await cr.SetPlayerCloth(config);
                break;
            case 2:
                await cr.SetPlayerBlendShape(config);
                break;
            case 3:
                await cr.SetTextrue(config);
                break;
            case 4:
                await cr.SetEyeTextrue(config);
                break;
            case 5:
                await cr.SetTextrue(config);
                break;
        }
    }
    public async UniTask<T> CreatNewDress<T>(Good good, CharacterDressRender cdr, string dir = null) where T : UnityEngine.Object
    {
        int type = good.id / 10000;
        string assetsName = null;
        if (good.assetsType == "1")
        {
            assetsName = ((good.id / 100) * 100).ToString();
            if ((good.id / 100) == 1415)//����
            {
                assetsName = good.id.ToString();
            }
        }
        else
        {
            if (type == 4 || type == 9)//üë/����
            {
                assetsName = $"{good.id}_BaseMap";
            }
            if (type == 15)//����
            {
                assetsName = ((good.id / 100) * 100).ToString();
                assetsName = $"{int.Parse(assetsName) + 1}_{good.id}_BaseMap";
            }

        }
        if (string.IsNullOrEmpty(assetsName))
        {
            assetsName = good.id.ToString();
        }
        assetsName += dir;
        var handle = await YooAssetManager.Instance.LoadAsset<T>(assetsName);
        if (handle as GameObject)
        {
            cdr.gameObject = GameObject.Instantiate(handle);
        }
        else
        {
            cdr.gameObject = handle;
        }
        //Debug.Log(type);
        if (type == 2)
        {
            int lastTwoDigits = good.id % 100;
            string texName = $"20000_200{lastTwoDigits.ToString("00")}_BaseMap";
            var tex = await YooAssetManager.Instance.LoadAsset<Texture>(texName);
            ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material.SetTexture("_BaseMap", tex);
            //Debug.Log(tex);
            //Debug.Log(cdr.gameObject);
        }
        if (type == 8)
        {
            if(good.id!=80000)
            {
                var mat = await YooAssetManager.Instance.LoadAsset<Material>(good.id.ToString() + "_mat");
                ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material = mat;
            }
 
        }
        if (type != 15 && type > 9 && type < 18)
        {
            var mat = await YooAssetManager.Instance.LoadAsset<Material>(good.id.ToString() + "_mat");
            ((GameObject)cdr.gameObject).transform.GetChild(0).GetComponent<SkinnedMeshRenderer>().material = mat;
        }
        cdr.good = good;
        return (T)cdr.gameObject;
    }

    /// <summary>
    /// �ͷ�selfRender(CharacterRender)�����ڵ�����ģ��
    /// </summary>
    /// <param name="cr"></param>
    public void CharacterDispose()
    {
        Destroy(selfRender.gameObject);
    }

}