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 string 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>
    /// 切换 -1-错误操作,0-结束,1-流程,2-子流程,3-子流程步骤
    /// </summary>
    /// <returns></returns>
    public int 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);

                //Debug.Log("进入下一步子流程步骤");
                return 3;
            }
            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);
                    //Debug.Log("进入下一步子流程");
                    return 2;
                }
                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);

                        Debug.Log($"<color=red>进入下一步流程</color>");
                        return 1;
                    }
                    else
                    {
                        Debug.Log($"<color=red>完成所有</color>");
                        //HQB 20240828完成后展示学习完成Tips
                        GameManager.UIMgr.ShowPanel<UI_TipsForPracticePanel>(E_UI_Layer.System);
                        return 0;
                    }

                }
            }
        }
        else
        {
            Debug.Log($"<color=red>按照流程走</color>");
            StepErrorTips();
            return -1;
        }

    }
    //public int currentSubProcessIDTemp = 0;
    /// <summary>
    /// 0 正常,1 不在当前步骤触发ID,2 当前步骤没有触发ID了
    /// </summary>
    /// <param name="triggerName"></param>
    /// <returns></returns>
    public int IsRightSubProcessStepsTriggerID(string triggerName, bool isRemove)
    {
        if (GameManager.RunModelMgr.ModeType != E_ModeType.Study) return 0;
        if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.precondition == GameManager.RunModelMgr.SceneType.ToString())
        {
            if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count > 0)
            {
                string currentSubProcessStepTriggerID = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName[0];
                if (triggerName == currentSubProcessStepTriggerID)
                {
                    if (isRemove)
                    {
                        d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.RemoveAt(0);
                    }
                    if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count == 0)
                    {

                        if (triggerName != "工具间按钮" && triggerName != "现场按钮" && triggerName != "收回工具")
                        {
                            //if (CheckSubProcessSteps(subProcessStepId) == 3)
                            //{

                            //}
                            //else
                            //{
                                GameManager.UIMgr.ShowPanel<UI_MessagePanel>(E_UI_Layer.System, (p) =>
                                {
                                    p.Init("提示", "当前步骤已完成,即将进入下一步", E_MessageType.Normal, () =>
                                    {
                                        CheckSubProcessSteps(subProcessStepId);
                                        CurrentSubProcessStepTriggerNames();
                                    });
                                });
                            //}
                        }
                        else
                        {
                            CheckSubProcessSteps(subProcessStepId);
                        }
                    }
                    CurrentSubProcessStepTriggerNames();

                    return 0;
                }
                else
                {
                    StepErrorTips();
                    return 1;
                }
            }
            else
            {
                Debug.Log($"<color=red>没有提示</color>");
                return 2;
            }
        }
        else
        {
            StepErrorTips();
            return -1;
        }
    }

    /// <summary>
    /// 切换流程之后, 当前子流程步骤triggerName不等于0的时候操作
    /// </summary>
    private void CurrentSubProcessStepTriggerNames()
    {
        if (d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName.Count != 0)
        {
            string triggerNameTemp = d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.triggersName[0];
            string splitResult = "";
            if (triggerNameTemp.Contains("+"))
            {
                splitResult = triggerNameTemp.Split('+')[1];
            }
            else
            {
                splitResult = triggerNameTemp;
            }
            subProcessStepTriggerID = splitResult;
            GameManager.EventMgr.EventTrigger<string>(Enum_EventType.SwitchSubProcessStepTriggerID, splitResult);
        }
    }

    /// <summary>
    /// 操作错子流程步骤的triggerName的错误提示
    /// </summary>
    private void StepErrorTips()
    {
        if (GameManager.UIMgr.GetPanel<UI_MiddleTipPanel>())
        {
            GameManager.UIMgr.GetPanel<UI_MiddleTipPanel>().Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}");
        }
        else
        {
            GameManager.UIMgr.ShowPanel<UI_MiddleTipPanel>(E_UI_Layer.System, (p) =>
            {
                p.Init($"错误,{d_Scheme.CurrentProcess.CurrentSubProcess.CurrentSubProcessStep.tipTitle}");
            });
        }
    }

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