using System;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using VirgoRT.Devices;

namespace VirgoRT.Modules.PMs
{
    class TemperatureControlRoutine : PMRoutineBase, IRoutine
    {
        private enum TCSequence
        {
            kCheckTemperature,
            kEnd
        }

        private int _checkSubstrateTempTimeout = 60;
        private double _TargetTemp = 0.0f;
        private double _OffsetTemp = 0.0f;
        private double _tolerance;

        public TemperatureControlRoutine(JetPM chamber) : base(chamber)
        {
            Name = "PreHeat";
            bUINotify = true;
        }

        public void Terminate()
        {
        }

        public Result Start(params object[] objs)
        {
            try
            {
                Reset();

                _TargetTemp = (double)objs[0];
                _checkSubstrateTempTimeout = SC.GetValue<int>($"{Module}.CheckSubstrateTempTimeout");
                _tolerance = SC.GetValue<double>($"System.MaxTemperatureToleranceToTarget");
                _OffsetTemp = SC.GetValue<double>($"{Module}.Chiller.ChillerTemperatureOffset");

                Notify($"开始, 目标 {_TargetTemp} ℃, 偏移值 { _OffsetTemp} ℃");
                return Result.RUN;
            }
            catch
            {
                return Result.FAIL;
            }
        }

        public Result Monitor()
        {
            try
            {
                if (SC.GetValue<bool>($"{Module}.Chiller.EnableChiller"))
                {
                    CheckCoolantTemp((int)TCSequence.kCheckTemperature, _TargetTemp, _OffsetTemp, _checkSubstrateTempTimeout, _tolerance);
                }
                else
                {
                    CheckSubstrateTemp((int)TCSequence.kCheckTemperature, _TargetTemp, _checkSubstrateTempTimeout, _tolerance);
                }

                End((int)TCSequence.kEnd);
            }
            catch (RoutineBreakException)
            {
                return Result.RUN;
            }
            catch (RoutineFaildException)
            {
                Notify("出错 ");
                return Result.FAIL;
            }
            catch (System.Exception ex)
            {
                Stop(ex.Message);
                return Result.FAIL;
            }

            Notify("结束");
            return Result.DONE;
        }

        public override void Abort() { }
    }
}