using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Venus_Core;
using Venus_RT.Devices;

namespace Venus_RT.Modules.PMs
{
    class PMPartialPressureRoutine : PMRoutineBase, IRoutine
    {
        int gasIndex;
        int GasMaxScale;
        public int counter;
        int gasTime;
        ValveType[] valveTypes = new ValveType[4] { ValveType.PV11, ValveType.PV21, ValveType.PV31, ValveType.PV41 };
        private enum PartialPressureStep
        {
            kDelay_1s,
            kStartGas,
            kReadChamberPressure,
            kEnd,
        }
        public PMPartialPressureRoutine(JetPM chamber) : base(chamber)
        {
            Name = "PMPartialPressure";

        }

        public RState Start(params object[] objs)
        {
            if (!CheckTurboPump())
            {
                return RState.Failed;
            }
            if (_chamber.GetPVPosition() == 0)
            {
                Stop("钟摆阀没有打开");
                return RState.Failed;
            }
            _chamber.OpenValve(ValveType.Guage, true);
            _chamber.OpenValve(ValveType.TurboPumpPumping, true);
            _chamber.OpenValve(ValveType.TurboPumpPurge, true);

            counter = 1;
            Reset();
            gasIndex = (int)objs[0];
            gasTime  = (int)objs[1];
            GasMaxScale = SC.GetValue<int>($"{Module}.MfcGas{gasIndex.ToString()}.MfcN2Scale");
            //_chamber.CloseValves();
            _chamber.SetPVPostion(1000);

            return Runner.Start(Module, Name);
        }
        public RState Monitor()
        {
            Runner.Delay((int)PartialPressureStep.kDelay_1s, 1000 * 1)
                  .LoopStart((int)PartialPressureStep.kStartGas, "Partial Pressure Test", 10, () => SetGasPoint(), gasTime)
                  .LoopEnd((int)PartialPressureStep.kReadChamberPressure, ReadChamberPressure, _delay_1s)
                  .End((int)PartialPressureStep.kEnd, () => 
                  {
                      _chamber.CloseValves();
                      return true; 
                  }, 500);            
            return Runner.Status;
        }

        private bool SetGasPoint()
        {
            if (gasIndex <= 4)
            {
                _chamber.OpenValve(valveTypes[gasIndex - 1], true);
            }
            _chamber.OpenValve(ValveType.GasFinal, true);
            _chamber.FlowGas(gasIndex - 1, GasMaxScale * 0.1 * counter);
            return true;
        }

        private bool ReadChamberPressure()
        {
            counter += 1;

            return true;
        }
        public void Abort()
        {
            _chamber.CloseValves();
        }
    }
}