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

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

    /// <summary>
    /// 实操项目id
    /// </summary>
    public int id = 10002;

    /// <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;


    /// <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.id = id;
        this.mode = mode;
        coroutine = GameManager.MonoMgr.StartCoroutine(CountDown(countDown));
        d_Scheme = DataManager.Instance.GetSchemeData(id);
        ReportManager.Instance.creport = DataManager.Instance.GetSchemeReport(id);

        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(string subProcessStepName)
    {
        if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.subProcessStepName.Equals(subProcessStepName))
        {
            int spStepID = subProcessStepId + 1;
            int spStepcount = d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes.Count;
            if (spStepID <= d_Scheme.CurrentProcess.CurrentSubProcess.subProcessStepes[spStepcount - 1].id)
            {
                HandoverSubProcessStep(spStepID);
                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);
                    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);
                        Debug.Log("进入下一步流程");
                        return true;
                    }
                    else
                    {
                        Debug.Log("完成所有");
                        return false;
                    }

                }
            }
        }
        else
        {
            Debug.Log("按照流程走");
            return false;
        }

    }


    /// <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()
    {
        id = -1;
        mode = E_ModeType.None;
        if (coroutine != null)
            GameManager.MonoMgr.StopCoroutine(coroutine);
        d_Scheme = null;
    }
}