using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;

/// <summary>
/// 数据管理类
/// </summary>
public class DataManager : BaseManager<DataManager>
{
    private DataManager()
    {
    }

    /// <summary>
    /// 方案
    /// </summary>
    private Dictionary<int, TB_Scheme> schemeDic = new Dictionary<int, TB_Scheme>();

    /// <summary>
    /// 流程
    /// </summary>
    private Dictionary<int, TB_Process> processDic = new Dictionary<int, TB_Process>();

    /// <summary>
    /// 子流程
    /// </summary>
    private Dictionary<int, TB_SubProcess> subProcessDic = new Dictionary<int, TB_SubProcess>();

    /// <summary>
    /// 子流程步骤
    /// </summary>
    private Dictionary<int, TB_SubProcessStep> subProcessStepDic = new Dictionary<int, TB_SubProcessStep>();

    /// <summary>
    /// 虚拟仿真系统
    /// </summary>
    private Dictionary<int, TB_System> systemDic = new Dictionary<int, TB_System>();

    /// <summary>
    /// 设备类型
    /// </summary>
    private Dictionary<int, TB_DeviceType> deviceTypeDic = new Dictionary<int, TB_DeviceType>();

    /// <summary>
    /// 工具材料
    /// </summary>
    private Dictionary<int, TB_ToolAndMaterial> toolAndMaterialDic = new Dictionary<int, TB_ToolAndMaterial>();



    /// <summary>
    /// 初始化
    /// </summary>
    public void Init()
    {
        schemeDic = GameManager.BinaryMgr.GetTable<TB_SchemeContainer>().dataDic;
        processDic = GameManager.BinaryMgr.GetTable<TB_ProcessContainer>().dataDic;
        subProcessDic = GameManager.BinaryMgr.GetTable<TB_SubProcessContainer>().dataDic;
        subProcessStepDic = GameManager.BinaryMgr.GetTable<TB_SubProcessStepContainer>().dataDic;
        systemDic = GameManager.BinaryMgr.GetTable<TB_SystemContainer>().dataDic;
        deviceTypeDic = GameManager.BinaryMgr.GetTable<TB_DeviceTypeContainer>().dataDic;
        toolAndMaterialDic = GameManager.BinaryMgr.GetTable<TB_ToolAndMaterialContainer>().dataDic;
    }

    public Dictionary<int, TB_DeviceType> GetAllDeviceTypes()
    {
        return deviceTypeDic;
    }

    /// <summary>
    /// 获取当前系统所有的方案
    /// </summary>
    /// <returns></returns>
    public List<TB_Scheme> GetAllSchemeName()
    {
        var allSchemeList = new List<TB_Scheme>();
        foreach (var item in schemeDic.Values)
        {
            if (item.systemId == GameManager.Instance.systemId)
                allSchemeList.Add(item);
        }

        return allSchemeList;
    }

    /// <summary>
    /// 根据方案 ToolOrMaterilOrDevice 获取当前系统全部工器具和材料
    /// </summary>
    /// <returns></returns>
    public List<D_ToolAndMaterialData> GetCurrentSystemToolAndMaterials(string tOrMOrD)
    {
        var currentSystemToolAndMaterials = new List<D_ToolAndMaterialData>();

        string[] tmdTemp = tOrMOrD.Split(',');

        for (int i = 0; i < tmdTemp.Length; i++)
        {
            int index = i;
            foreach (var item in toolAndMaterialDic.Values)
            {
                if (item.id == int.Parse(tmdTemp[index]))
                {
                    D_ToolAndMaterialData d_ToolAndMaterialData = new D_ToolAndMaterialData();
                    d_ToolAndMaterialData.id = item.id;
                    d_ToolAndMaterialData.objName = item.objName;
                    d_ToolAndMaterialData.type = item.type;
                    d_ToolAndMaterialData.prefabName = item.prefabName;
                    d_ToolAndMaterialData.iconSpriteName = item.iconSpriteName;
                    currentSystemToolAndMaterials.Add(d_ToolAndMaterialData);
                }
            }
        }
        return currentSystemToolAndMaterials;
    }




    /// <summary>
    /// 获取D_Scheme
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public D_Scheme GetSchemeData(int id)
    {
        D_Scheme d_Scheme = new D_Scheme();
        //获取方案数据
        if (schemeDic.ContainsKey(id))
        {
            d_Scheme.id = schemeDic[id].id;
            d_Scheme.schemeName = schemeDic[id].schemeName;
            d_Scheme.ToolOrMaterilOrDevice = schemeDic[id].ToolOrMaterilOrDevice;
        }
        d_Scheme.processes = GetD_Processes(d_Scheme.id);
        return d_Scheme;
    }

    /// <summary>
    /// 根据方案Id 获取流程列表
    /// </summary>
    /// <param name="schemeId"></param>
    /// <returns></returns>
    private List<D_Process> GetD_Processes(int schemeId)
    {
        List<D_Process> d_Processes = new List<D_Process>();
        //获取方案流程数据
        foreach (var item in processDic.Values)
        {
            if (item.schemeId == schemeId)
            {
                D_Process d_Process = new D_Process();
                d_Process.id = item.id;
                d_Process.processName = item.processName;
                int processId = item.id;
                d_Process.subProcesses = GetD_SubProcesses(schemeId, processId);
                d_Processes.Add(d_Process);
            }
        }

        return d_Processes;
    }

    /// <summary>
    /// 根据方案Id,流程Id ,获取子流程列表
    /// </summary>
    /// <param name="schemeId"></param>
    /// <param name="processId"></param>
    /// <returns></returns>
    public List<D_SubProcess> GetD_SubProcesses(int schemeId, int processId)
    {
        List<D_SubProcess> d_SubProcesses = new List<D_SubProcess>();
        foreach (var item in subProcessDic.Values)
        {
            if (item.schemeId == schemeId && item.processId == processId)
            {
                D_SubProcess d_SubProcess = new D_SubProcess();
                d_SubProcess.id = item.id;
                d_SubProcess.schemeId = item.schemeId;
                d_SubProcess.processId = item.processId;
                d_SubProcess.subProcessName = item.subProcessName;
                d_SubProcess.isPrecondition = item.isPrecondition;
                d_SubProcess.precondition = item.precondition;
                d_SubProcess.tips = item.tips;
                int subProcessId = item.id;
                d_SubProcess.subProcessStepes = GetD_SubProcessSteps(schemeId, processId, subProcessId);
                d_SubProcesses.Add(d_SubProcess);
            }
        }

        return d_SubProcesses;
    }

    /// <summary>
    /// 根据方案Id,流程Id,子流程Id  获取子流程步骤列表
    /// </summary>
    /// <param name="schemeId"></param>
    /// <param name="processId"></param>
    /// <param name="subProcessStepId"></param>
    /// <returns></returns>
    private List<D_SubProcessStep> GetD_SubProcessSteps(int schemeId, int processId, int subProcessId)
    {
        List<D_SubProcessStep> d_SubProcessSteps = new List<D_SubProcessStep>();
        foreach (var step in subProcessStepDic.Values)
        {
            if (step.schemeId == schemeId && step.processId == processId && step.subProcessId == subProcessId)
            {
                D_SubProcessStep d_SubProcessStep = new D_SubProcessStep();
                d_SubProcessStep.id = step.id;
                d_SubProcessStep.schemeId = step.schemeId;
                d_SubProcessStep.processId = step.processId;
                d_SubProcessStep.subProcessId = step.subProcessId;
                d_SubProcessStep.subProcessStepName = step.subProcessStepName;
                d_SubProcessStep.isPrecondition = step.isPrecondition;
                d_SubProcessStep.precondition = step.precondition;
                d_SubProcessStep.triggerID = step.triggerID;
                d_SubProcessStep.tipTitle = step.tipTitle;
                d_SubProcessStep.score = step.score;
                d_SubProcessSteps.Add(d_SubProcessStep);
            }
        }

        return d_SubProcessSteps;
    }


    public List<int> GetSubProcessStepIDByTriggerID(int triggerID)
    {
        List<TB_SubProcessStep> tb_subProcesssSteps = new List<TB_SubProcessStep>();
        List<int> stepIDsTemp = new List<int>();
        foreach (var item in subProcessStepDic.Values)
        {
            if (item.schemeId == GameManager.ProcessMgr.schemeID)
                tb_subProcesssSteps.Add(item);
        }
        foreach (var item in tb_subProcesssSteps)
        {
            if (string.IsNullOrEmpty(item.triggerID))
            {
                continue;
            }
            string[] subProcessStepToolID = item.triggerID.Split(',');
            for (int i = 0; i < subProcessStepToolID.Length; i++)
            {
                if (int.Parse(subProcessStepToolID[i]) == triggerID)
                    stepIDsTemp.Add(item.id);
            }
        }
        return stepIDsTemp;
    }

    /// <summary>
    /// 根据系统Id 获取系统信息
    /// </summary>
    /// <param name="systemId"></param>
    /// <returns></returns>
    public TB_System GetSystemInfo(int systemId)
    {
        if (systemDic.ContainsKey(systemId))
        {
            return systemDic[systemId];
        }

        return null;
    }

    /// <summary>
    /// 获取报告
    /// </summary>
    /// <param name="id"></param>
    public R_Scheme GetSchemeReport(int id)
    {
        R_Scheme r_Scheme = new R_Scheme();


        return r_Scheme;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public TB_Scheme GetTitleSpriteName(int id)
    {
        if (schemeDic.ContainsKey(id))
        {
            return schemeDic[id];
        }

        return null;
    }
}