using Config.config;
using System.Collections.Generic;
using UnityEngine;
/// 
/// 路段
/// 
public partial class SectionRoad : MonoBehaviour
{
    /// 
    /// 最大索引
    /// 
    [HideInInspector] public int maxIndex;
    /// 
    /// 最小索引
    /// 
    [HideInInspector] public int minIndex;
    /// 
    /// 记录最大索引
    /// 
    private int recordMaxIndex;
    /// 
    /// 记录最小索引
    /// 
    private int recordMinIndex;
    /// 
    /// NPC车节点
    /// 
    public Transform npcCarNode;
    /// 
    /// 左建筑群
    /// 
    public GameObject leftBuilding;
    /// 
    /// 右建筑群
    /// 
    public GameObject rightBuilding;
    /// 
    /// 车道
    /// 
    public List lane;
    /// 
    /// 生成点
    /// 
    public List generatePoints;
    /// 
    /// NPC车
    /// 
    private List npcCars = new List();
    /// 
    /// 火车
    /// 
    private List trains = new List();
    /// 
    /// 路障
    /// 
    private List roadblockObjs = new List();
    /// 
    /// 生成距离
    /// 
    private List generatingDistance = new List() { 0, -15, -30, -45, -60 };
    /// 
    /// 初始化
    /// 
    public void Init()
    {
        minIndex = 0;
        maxIndex = lane.Count - 1;
        recordMaxIndex = maxIndex;
        recordMinIndex = minIndex;
        for (int i = 0; i < lane.Count; i++)
        {
            lane[i].gameObject.SetActive(true);
        }
    }
    /// 
    /// 初始化车道数
    /// 
    public void InitLaneNumber(int number)
    {
        int currenLaneNumber = GetCurrentLaneNumber();
        bool isShow = currenLaneNumber > number ? false : true;//是否是显示
        bool isLeft = false;
        for (int i = 0; i < Mathf.Abs(currenLaneNumber - number); i++)
        {
            isLeft = ProbabilityManager.Instance.GetPercent(50);
            if (isShow)
            {
                if (minIndex == recordMinIndex)
                {
                    isLeft = false;
                }
                else if (maxIndex == recordMaxIndex)
                {
                    isLeft = true;
                }
            }
            if (isLeft)//从左开始
            {
                if (isShow)
                {
                    lane[--minIndex].gameObject.SetActive(true);
                }
                else
                {
                    lane[minIndex++].gameObject.SetActive(false);
                }
            }
            else
            {
                if (isShow)
                {
                    lane[++maxIndex].gameObject.SetActive(true);
                }
                else
                {
                    lane[maxIndex--].gameObject.SetActive(false);
                }
            }
            SetBuilding();
        }
    }
    /// 
    /// 生成路障
    /// 
    public void GenerateRoadblock(SectionRoad sectionRoad)
    {
        PutRoadblockObjs();
        for (int i = 0; i < sectionRoad.lane.Count; i++)
        {
            if (lane[i].activeInHierarchy && !sectionRoad.lane[i].activeInHierarchy)
            {
                for (int j = 0; j < 3; j++)
                {
                    GameObject roadblockObj = CachePoolManager.Instance.Take(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "Roadblock"));
                    roadblockObj.transform.position = lane[i].transform.position + Vector3.right * (300 - j * 20);
                    roadblockObj.transform.localEulerAngles = Vector3.zero;
                    roadblockObj.transform.localScale = Vector3.one;
                    roadblockObjs.Add(roadblockObj);
                }
            }
        }
    }
    /// 
    /// 两者一致
    /// 
    public void BothAreConsistent(SectionRoad sectionRoad)
    {
        for (int i = 0; i < sectionRoad.lane.Count; i++)
        {
            this.lane[i].gameObject.SetActive(sectionRoad.lane[i].activeInHierarchy);
        }
        this.minIndex = sectionRoad.minIndex;
        this.maxIndex = sectionRoad.maxIndex;
        SetBuilding();
    }
    /// 
    /// 返回空车道
    /// 
    /// 
    public (Vector3, int) GetEmptyLane()
    {
        List ints = new List { 0, 1, 2, 3, 4, 5 };
        int number;
        while (true)
        {
            number = ints[Random.Range(0, ints.Count)];
            if (lane[number].activeInHierarchy && occupationIndex.Find(s => s.index == number) == null)
            {
                return (lane[number].transform.localPosition, number);
            }
            else
            {
                ints.Remove(number);
            }
        }
    }
    /// 
    /// 车放回缓存池
    /// 
    public void PutCar()
    {
        for (int i = 0; i < npcCars.Count; i++)
        {
            CachePoolManager.Instance.Put(npcCars[i].gameObject);
        }
        for (int i = 0; i < trains.Count; i++)
        {
            CachePoolManager.Instance.Put(trains[i].gameObject);
        }
        npcCars.Clear();
        trains.Clear();
    }
    /// 
    /// 路障放回缓存池
    /// 
    public void PutRoadblockObjs()
    {
        for (int i = 0; i < roadblockObjs.Count; i++)
        {
            CachePoolManager.Instance.Put(roadblockObjs[i].gameObject);
        }
        roadblockObjs.Clear();
    }
    /// 
    /// 设置建筑群
    /// 
    public void SetBuilding()
    {
        leftBuilding.transform.localPosition = new Vector3((lane[minIndex].transform.localPosition - Vector3.right * 13f).x, leftBuilding.transform.localPosition.y, 0);
        rightBuilding.transform.localPosition = new Vector3((lane[maxIndex].transform.localPosition + Vector3.right * 13f).x, rightBuilding.transform.localPosition.y, 0);
    }
    /// 
    /// 设置建筑主题
    /// 
    public void SetBuildingTheme(LevelConfig levelConfig)
    {
        GameObject building;
        switch (levelConfig.Theme)
        {
            case "Country":
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "LeftCountryBuilding"));
                building.transform.SetParent(leftBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "RightCountryBuilding"));
                building.transform.SetParent(rightBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                break;
            case "City":
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "LeftCityBuilding"));
                building.transform.SetParent(leftBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "RightCityBuilding"));
                building.transform.SetParent(rightBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                break;
            case "MountainousRegion":
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "LeftMountainousRegionBuilding"));
                building.transform.SetParent(leftBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "RightMountainousRegionBuilding"));
                building.transform.SetParent(rightBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                break;
            case "Desert":
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "LeftDesertBuilding"));
                building.transform.SetParent(leftBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                building = Instantiate(YooAssetManager.Instance.LoadAssetSync(PackagesName.GameData, "RightDesertBuilding"));
                building.transform.SetParent(rightBuilding.transform);
                building.transform.localEulerAngles = Vector3.zero;
                building.transform.localScale = Vector3.one;
                building.transform.localPosition = Vector3.zero;
                break;
        }
    }
    /// 
    /// 得到当前显示车道数
    /// 
    /// 
    public int GetCurrentLaneNumber()
    {
        int number = 0;
        for (int i = 0; i < lane.Count; i++)
        {
            if (lane[i].activeInHierarchy)
            {
                number++;
            }
        }
        return number;
    }
    /// 
    /// 得到出生点
    /// 
    /// 
    public (Vector3, int) GetBirthPoint()
    {
        int randomIndex = Random.Range(minIndex + 1, maxIndex);
        return (lane[randomIndex].transform.position + transform.forward * 20, randomIndex);
    }
}