using SC.XR.Unity;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 单排扇形
/// </summary>
public class SRSectorLayout : MonoBehaviour
{
    /// <summary>
    /// 根据素材数量对物体进行布局组合
    /// 忽略文字类型
    /// </summary>
    /// <param name="materialObls">素材</param>
    /// <param name="par">素材父物体</param>
    /// <returns></returns>
    public static List<ObjectValue> CalLayout(MaterialObl materialObls, GameObject par, out MaterialObl newmaterial)
    {
        newmaterial = materialObls;
        BaseTemPlate text = new BaseTemPlate();
        MaterialObjValue textmat = null;
        List<BaseTemPlate> noText = new List<BaseTemPlate>();
        List<ObjectValue> objectValues = new List<ObjectValue>();

        for (int i = 0; i < materialObls.materialList.Count; i++)
        {
            var mat = materialObls.materialList[i];
            GameObject go = null;
            switch (int.Parse(mat.type))
            {
                case (int)MaterialType.None:
                    break;
                case (int)MaterialType.Image:
                    var pImage = ResMgr.Instance.Load<GameObject>("Template/Prefab/Image");
                    go = Instantiate(pImage, par.transform);
                    var imageitem = go.AddComponent<TemplateImage>();
                    go.SetActive(true);
                    imageitem.SetData(mat, materialObls.updateTime);
                    noText.Add(imageitem);
                    break;
                case (int)MaterialType.Video:
                    var pVideo = ResMgr.Instance.Load<GameObject>("Template/Prefab/Video");
                    go = Instantiate(pVideo, par.transform);
                    var videoitem = go.AddComponent<TemplateVideo>();
                    go.SetActive(true);
                    videoitem.SetData(mat, materialObls.updateTime);
                    noText.Add(videoitem);
                    break;
                case (int)MaterialType.Text:
                    textmat = mat;
                    var pText = ResMgr.Instance.Load<GameObject>("Template/Prefab/Text");
                    go = Instantiate(pText, par.transform);
                    var textitem = go.AddComponent<TemplateText>();
                    go.SetActive(true);
                    textitem.SetData(mat, materialObls.updateTime);
                    text = textitem;
                    go.SetActive(false);
                    break;
                default:
                    break;
            }

            if (go != null)
            {
                go.name = string.IsNullOrWhiteSpace(mat.name) ? par.name + "-" + i.ToString() : mat.name;
                go.AddComponent<EditorEventHandler>().Type = (MaterialType)(int.Parse(mat.type));

                if (materialObls.select)
                {
                    go.transform.localPosition = mat.ObjectTransform.nowPos;
                    go.transform.localEulerAngles = mat.ObjectTransform.nowRot;
                    go.transform.localScale = mat.ObjectTransform.nowScale;

                }
                else
                {
                    go.transform.localEulerAngles = Vector3.zero;
                    go.transform.localScale = new Vector3(1, 1, 1);

                    if (int.Parse(mat.type) != (int)MaterialType.Text)
                    {
                        go.transform.localPosition = Vector3.zero;
                    }
                    else
                    {
                        //Set text position
                        if (mat.textPosition == "top")
                        {
                            go.transform.localPosition = new Vector3(0, 0.6f, 0);
                        }
                        else if (mat.textPosition == "bottom")
                        {
                            go.transform.localPosition = new Vector3(0, -0.6f, 0);
                        }
                    }
                    mat.ObjectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale);
                }

                ObjectValue objectValue = new ObjectValue(i, materialObls.id, mat.name, go);
                objectValues.Add(objectValue);
            }
        }

        #region 需要判断是否是第一次编辑坐标,若是则执行下方代码,不是则直接返回

        if (!materialObls.select)
        {
            var count = noText.Count;
            switch (count)
            {
                case 3:
                    Column_3(noText, par);
                    break;
                case 4:
                    Column_4(noText, par);
                    break;
                case 5:
                    Column_5(noText, par);
                    break;
                case 6:
                    Column_6(noText, par);
                    break;
                default:
                    break;
            }


            //第一次排列后,需调整初始坐标和当前坐标保持一致
            for (int i = 0; i < objectValues.Count; i++)
            {
                objectValues[i].InitTransform();
                objectValues[i].Object.SetActive(true);
                var go = objectValues[i].Object;
                newmaterial.materialList[objectValues[i].ID].ObjectTransform.SetStartValue(go.transform.localPosition, go.transform.localEulerAngles, go.transform.localScale);
            }
        }
        if (textmat != null)
        {
            text.gameObject.SetActive(true);
        }

        #endregion

        return objectValues;
    }

    /// <summary>
    /// 根据数量排列图片或文字
    /// </summary>
    /// <param name="data">图片和视频列表</param>
    private static void Column_3(List<BaseTemPlate> data, GameObject game)
    {
        var scgrid = game.AddComponent<SCGridLayoutGroup>();
        scgrid.IsIgnoreInactiveObj = true;
        scgrid.LayoutType = LayoutTypes.Vertical;
        scgrid.Rows = 1;
        scgrid.SpaceX = 0.7f;
        scgrid.RefreshInfo();
        Destroy(scgrid);

        data[0].transform.localPosition += new Vector3(0, 0, -0.18f);
        data[0].transform.localRotation = Quaternion.Euler(0, -30, 0);

        data[2].transform.localPosition += new Vector3(0, 0, -0.18f);
        data[2].transform.localRotation = Quaternion.Euler(0, 30, 0);
    }
    /// <summary>
    /// 根据数量排列图片或文字
    /// </summary>
    /// <param name="data">图片和视频列表</param>
    private static void Column_4(List<BaseTemPlate> data, GameObject game)
    {
        var scgrid = game.AddComponent<SCGridLayoutGroup>();
        scgrid.IsIgnoreInactiveObj = true;
        scgrid.LayoutType = LayoutTypes.Vertical;
        scgrid.Rows = 1;
        scgrid.SpaceX = 0.7f;
        scgrid.RefreshInfo();
        Destroy(scgrid);

        data[0].transform.localPosition += new Vector3(0, 0, -0.35f);
        data[0].transform.localRotation = Quaternion.Euler(0, -45, 0);

        data[3].transform.localPosition += new Vector3(0, 0, -0.35f);
        data[3].transform.localRotation = Quaternion.Euler(0, 45, 0);
    }
    /// <summary>
    /// 根据数量排列图片或文字
    /// </summary>
    /// <param name="data">图片和视频列表</param>
    private static void Column_5(List<BaseTemPlate> data, GameObject game)
    {
        var scgrid = game.AddComponent<SCGridLayoutGroup>();
        scgrid.IsIgnoreInactiveObj = true;
        scgrid.LayoutType = LayoutTypes.Vertical;
        scgrid.Rows = 1;
        scgrid.SpaceX = 0.7f;
        scgrid.RefreshInfo();
        Destroy(scgrid);

        data[0].transform.localPosition += new Vector3(0.15f, 0, -0.65f);
        data[0].transform.localRotation = Quaternion.Euler(0, -45, 0);

        data[4].transform.localPosition += new Vector3(-0.15f, 0, -0.65f);
        data[4].transform.localRotation = Quaternion.Euler(0, 45, 0);

        data[1].transform.localPosition += new Vector3(0, 0, -0.22f);
        data[1].transform.localRotation = Quaternion.Euler(0, -30, 0);

        data[3].transform.localPosition += new Vector3(0, 0, -0.22f);
        data[3].transform.localRotation = Quaternion.Euler(0, 30, 0);
    }

    /// <summary>
    /// 根据数量排列图片或文字
    /// </summary>
    /// <param name="data">图片和视频列表</param>
    private static void Column_6(List<BaseTemPlate> data, GameObject game)
    {
        var scgrid = game.AddComponent<SCGridLayoutGroup>();
        scgrid.IsIgnoreInactiveObj = true;
        scgrid.LayoutType = LayoutTypes.Vertical;
        scgrid.Rows = 1;
        scgrid.SpaceX = 0.7f;
        scgrid.RefreshInfo();
        Destroy(scgrid);

        data[0].transform.localPosition += new Vector3(0.15f, 0, -0.65f);
        data[0].transform.localRotation = Quaternion.Euler(0, -45, 0);

        data[5].transform.localPosition += new Vector3(-0.15f, 0, -0.65f);
        data[5].transform.localRotation = Quaternion.Euler(0, 45, 0);

        data[1].transform.localPosition += new Vector3(0, 0, -0.22f);
        data[1].transform.localRotation = Quaternion.Euler(0, -30, 0);

        data[4].transform.localPosition += new Vector3(0, 0, -0.22f);
        data[4].transform.localRotation = Quaternion.Euler(0, 30, 0);
    }
}