using System.Collections;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using UnityEngine;

public class ProcessManager : BaseManager<ProcessManager>
{
    /// <summary>
    /// 构造函数
    /// </summary>
    private ProcessManager()
    {
    }


    /// <summary>
    /// 模式
    /// </summary>
    public E_ModeType mode;

    /// <summary>
    /// 用户数据
    /// </summary>
    public UserData userData = new UserData();
    /// <summary>
    /// 当前的项目/方案
    /// </summary>
    public D_Scheme d_Scheme;


    /// <summary>
    ///当前方案ID
    /// </summary>
    public int schemeID = -1;

    /// <summary>
    /// 当前流程Id
    /// </summary>
    public int processId = -1;

    /// <summary>
    /// 当前子流程Id
    /// </summary>
    public int subProcessId = -1;

    /// <summary>
    /// 当前子流程步骤Id
    /// </summary>
    public int subProcessStepId = -1;

    public int subProcessStepTriggerID = -1;

    /// <summary>
    /// 倒计时,剩余时长
    /// </summary>
    public int countDown = 0;

    /// <summary>
    /// 实训/考试时长
    /// </summary>
    private int time;

    /// <summary>
    /// 记录倒计时的协程
    /// </summary>
    private Coroutine coroutine;

    /// <summary>
    /// 初始化
    /// 根据方案id 生成流程数据
    /// </summary>
    /// <param name="id">方案id</param>
    public void Init(int id, E_ModeType mode, int countDown = 600) //TODO 考试断线重连应该考虑初始化问题
    {
        this.schemeID = id;
        this.mode = mode;
        coroutine = GameManager.MonoMgr.StartCoroutine(CountDown(countDown));
        d_Scheme = DataManager.Instance.GetSchemeData(id);
        ReportManager.Instance.creport = DataManager.Instance.GetSchemeReport(id);
        GameManager.ToolAndmaterialMgr.Init(d_Scheme.ToolOrMaterilOrDevice);
        d_Scheme.Init();
        Debug.Log("流程初始化完成");
    }

    /// <summary>
    /// 切换流程
    /// </summary>
    public void HandoverProcess(int processId, int subProcessId = 0, int subProcessStepId = 0)
    {
        if (processId == -1 || subProcessId == -1 || subProcessStepId == -1)
            return;
        d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId);
    }

    /// <summary>
    /// 切换流程
    /// </summary>
    public void HandoverSubProcess(int subProcessId, int subProcessStepId = 0)
    {
        if (processId == -1 || subProcessId == -1 || subProcessStepId == -1)
            return;
        d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId);
    }

    /// <summary>
    /// 切换流程
    /// </summary>
    public void HandoverSubProcessStep(int subProcessStepId)
    {
        if (processId == -1 || subProcessId == -1 || subProcessStepId == -1)
            return;
        d_Scheme.HandoverProcess(processId, subProcessId, subProcessStepId);
    }

    /// <summary>
    /// 切换
    /// </summary>
    /// <returns></returns>
    public bool CheckSubProcessSteps(int subProcessStepID)
    {
        if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStepId.Equals(subProcessStepID))
        {
            int spStepID = subProcessStepId + 1;
            int spStepcount = d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes.Count;
            if (spStepID <= d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes[spStepcount - 1].id)
            {
                HandoverSubProcessStep(spStepID);
                GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) =>
                {
                    panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}");
                });
                Debug.Log("进入下一步子流程步骤");
                return true;
            }
            else
            {
                int spCount = d_Scheme.CurrentProcess.subProcesses.Count;
                int spID = subProcessId + 1;
                if (spID <= d_Scheme.CurrentProcess.subProcesses[spCount - 1].id)
                {
                    HandoverSubProcess(spID, 0);
                    GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcess, d_Scheme.CurrentProcess.CurrentSubProcessId);
                    GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) =>
                    {
                        panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}");
                    });
                    Debug.Log("进入下一步子流程");
                    return true;
                }
                else
                {
                    int pCount = d_Scheme.processes.Count;
                    int pID = processId + 1;
                    if (pID <= d_Scheme.processes[pCount - 1].id)
                    {
                        HandoverProcess(pID, 0, 0);
                        GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcessStep, d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStepId);
                        GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcess, d_Scheme.CurrentProcess.CurrentSubProcessId);
                        GameManager.UIMgr.ShowPanel<UI_TopTipPanel>(E_UI_Layer.System, (panel) =>
                        {
                            panel.Init($"{d_Scheme.CurrentProcess.processName}:<color=blue>{d_Scheme.CurrentProcess.CurrentSubProcess.subProcessName}</color>", $"{d_Scheme.CurrentProcess.CurrentSubProcess.tips}");
                        });
                        Debug.Log("进入下一步流程");
                        return true;
                    }
                    else
                    {
                        Debug.Log("完成所有");
                        return false;
                    }

                }
            }
        }
        else
        {
            Debug.Log("按照流程走");
            GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.Mid, (panel) =>
            {
                panel.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}");
            });
            return false;
        }

    }

    /// <summary>
    /// 0 正常,1 不在当前步骤触发ID,2 当前步骤没有触发ID了
    /// </summary>
    /// <param name="triggerID"></param>
    /// <returns></returns>
    public int IsRightSubProcessStepsTriggerID(int triggerID, bool isRemove)
    {
        if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.precondition == GameManager.RunModelMgr.SceneType.ToString())
        {
            if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.Count > 0)
            {
                int currentSubProcessStepTriggerID = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId[0];
                if (triggerID == currentSubProcessStepTriggerID)
                {
                    if (isRemove)
                        d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.RemoveAt(0);
                    if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId.Count == 0)
                    {
                        CheckSubProcessSteps(GameManager.ProcessMgr.subProcessStepId);
                        Debug.Log($"<color=red>triggersId空了</color>");
                    }
                    GameManager.EventMgr.EventTrigger<int>(Enum_EventType.SwitchSubProcessStepTriggerID, d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersId[0]);
                    return 0;
                }
                else
                {
                    GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) =>
                    {
                        p.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}");
                    });
                    return 1;
                }
            }
            else
            {
                Debug.Log($"<color=red>没有提示</color>");
                return 2;
            }
        }
        else
        {
            GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) =>
            {
                p.Init($"错误,请前往{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.SceneName()}");
            });
            return -1;
        }
    }

    /// <summary>
    /// 倒计时
    /// </summary>
    /// <param name="time">倒计时多久</param>
    /// <returns></returns>
    private IEnumerator CountDown(int time)
    {
        this.time = time;
        countDown = time;
        WaitForSeconds waitForSeconds = new WaitForSeconds(1);
        while (countDown > 0)
        {
            yield return waitForSeconds;
            countDown--;
        }
    }

    /// <summary>
    /// 结束
    /// </summary>
    public void End()
    {
        schemeID = -1;
        mode = E_ModeType.None;
        if (coroutine != null)
            GameManager.MonoMgr.StopCoroutine(coroutine);
        d_Scheme = null;
    }
}