using Aitex.Core.Util;
using FurnaceUI.Models;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.OperationCenter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace FurnaceUI.Views.Maintenances
{
    public class BoatRobotViewModel : FurnaceUIViewModelBase
    {
        [Subscription("Rt.Status")]
        public string RtStatus { get; set; }
        public bool IsSystemStaus => (RtStatus != "AutoRunning");
        #region ZAxis Data
        [Subscription("PM1.BoatElevatorServo.CurrentPosition")]
        public float BoatZAxisCurrentPosition { get; set; }
        [Subscription("PM1.BoatElevatorServo.CurrentSpeed")]
        public float BoatZAxisCurrentSpeed { get; set; }
        [Subscription("PM1.BoatElevatorServo.TargetPosition")]
        public float BoatZAxisTargetPosition { get; set; }
        [Subscription("PM1.BoatElevatorServo.IsReady")]
        public bool BoatZAxisIsReady { get; set; }
        [Subscription("PM1.AlarmSignaBoatZAxisWarning.Value")]
        public bool BoatZAxisIsWarning { get; set; }
        [Subscription("PM1.AlarmSignaBoatZAxisAlarm.Value")]
        public bool BoatZAxisIsAlarm { get; set; }
        [Subscription("PM1.BoatElevatorServo.AtPosition1")]
        public bool BoatZAxisAtPosition1 { get; set; }
        [Subscription("PM1.BoatElevatorServo.AtPosition2")]
        public bool BoatZAxisAtPosition2 { get; set; }
        [Subscription("PM1.BoatElevatorServo.AtPosition3")]
        public bool BoatZAxisAtPosition3 { get; set; }
        [Subscription("PM1.BoatElevatorServo.AtHomePosition")]
        public bool BoatZAxisAtHomePosition { get; set; }
        [Subscription("PM1.BoatElevatorServo.IsServoOn")]
        public bool BoatZAxisIsServoOn { get; set; }
        [Subscription("PM1.BoatElevatorServo.ErrorCode")]
        public string BoatZAxisErrorCode { get; set; }
        [Subscription("PM1.BoatElevatorServo.Status")]
        public string BoatZAxisStatus { get; set; }
        [Subscription("PM1.BoatElevatorServo.IsActionEnable")]
        public bool BoatZAxisIsActionEnable { get; set; }
        [Subscription("PM1.BoatElevatorServo.IsMoving")]
        public bool BoatZAxisIsMoving { get; set; }
        public double ZAxisProcessPosition { get; set; }
        public double ZAxisPosition5 { get; set; }
        public double ZAxisPosition4 { get; set; }
        public double ZAxisPosition3 { get; set; }
        public double ZAxisPosition2 { get; set; }
        public double ZAxisPosition1 { get; set; }
        public double ZAxisHomePosition { get; set; }
        public double ZAxisPositiveLimit { get; set; }
        public double ZAxisNegativeLimit { get; set; }
        public double ZAxisMoveSpeed { get; set; }
        public double ZAxisAcc { get; set; }
        public double ZAxisDec { get; set; }
        public double ZAxisJogSpeed { get; set; }
        public double ZAxisAccTime { get; set; }
        public double ZAxisDecTime { get; set; }
        /// 
        /// 修改对应位置转换,Position1->在2位置,Position2->在1位置
        /// 
        private Dictionary zPositionTranslate = new Dictionary()
        {{"Position1","Position2" }, {"Position2","Position1" },{"Position3","Position3" }};
        #endregion
        #region RAxis Data
        [Subscription("PM1.BoatRotationServo.CurrentPosition")]
        public float BoatRAxisCurrentPosition { get; set; }
        [Subscription("PM1.BoatRotationServo.CurrentSpeed")]
        public float BoatRAxisCurrentSpeed { get; set; }
        [Subscription("PM1.BoatRotationServo.TargetPosition")]
        public float BoatRAxisTargetPosition { get; set; }
        [Subscription("PM1.BoatRotationServo.IsReady")]
        public bool BoatRAxisIsReady { get; set; }
        [Subscription("PM1.BoatRotationServo.IsMoving")]
        public bool BoatRAxisIsMoving { get; set; }
        [Subscription("PM1.BoatRotationServo.IsInitDone")]
        public bool BoatRAxisIsInitDone { get; set; }
        [Subscription("PM1.BoatRotationServo.IsHomeDone")]
        public bool BoatRAxisIsHomeDone { get; set; }
        [Subscription("PM1.BoatRotationServo.IsHoming")]
        public bool BoatRAxisIsHoming { get; set; }
        [Subscription("PM1.BoatRotationServo.IsInitializing")]
        public bool BoatRAxisIsInitializing { get; set; }
        [Subscription("PM1.AlarmSignaBoatRAxisWarning.Value")]
        public bool BoatRAxisIsWarning { get; set; }
        [Subscription("PM1.AlarmSignaBoatRAxisAlarm.Value")]
        public bool BoatRAxisIsAlarm { get; set; }
        [Subscription("PM1.BoatRotationServo.IsServoOn")]
        public bool BoatRAxisIsServoOn { get; set; }
        [Subscription("PM1.BoatRotationServo.ErrorCode")]
        public string BoatRAxisErrorCode { get; set; }
        [Subscription("PM1.BoatRotationServo.Status")]
        public string BoatRAxisStatus { get; set; }
        [Subscription("PM1.BoatRotationServo.Direction")]
        public string BoatRAxisDirection { get; set; }
        [Subscription("PM1.BoatRotationServo.IsActionEnable")]
        public bool BoatRAxisIsActionEnable { get; set; }
        [Subscription("PM1.BoatRotationServo.IsMotorRun")]
        public bool BoatRAxisIsMotorRun { get; set; }
        public double RAxisLoadPosition { get; set; }
        public double RAxisPosition180 { get; set; }
        public double RAxisPosition90 { get; set; }
        public double RAxisPosition45 { get; set; }
        public double RAxisHomePosition { get; set; }
        public double RAxisPositiveLimit { get; set; }
        public double RAxisNegativeLimit { get; set; }
        public double RAxisMoveSpeed { get; set; }
        public double RAxisJogSpeed { get; set; }
        public double RAxisAccTime { get; set; }
        public double RAxisDecTime { get; set; }
        #endregion
        #region Shutter Data
        [Subscription("PM1.Shutter.OpenCloseStatus")]
        public string AutoDoorOpenCloseStatus { get; set; }
        #endregion
        [Subscription("Boat.BoatTestCycledCount")]
        public int BoatTestCycledCount { get; set; }
        private int _boatCycleCountSetPoint;
        public string BoatCycleDisplay => $"  {BoatTestCycledCount} / {_boatCycleCountSetPoint}";
        private List _ZPositions;
        public List ZPositions
        {
            get { return _ZPositions; }
            set { _ZPositions = value; NotifyOfPropertyChange("ZPositions"); }
        }
        private List _RPositions;
        public List RPositions
        {
            get { return _RPositions; }
            set { _RPositions = value; NotifyOfPropertyChange("RPositions"); }
        }
        public string ZAxisTestStartPosition { get; set; }
        public string ZAxisTestEndPosition { get; set; }
        public string RAxisTestDirection{ get; set; }
        //public bool IsPermission { get => this.Permission >= 3 && ClientApp.Instance.UserContext.RoleName == "Service"; }
        public bool IsPermission { get => this.Permission >= 3; }
        public BoatRobotViewModel()
        {
            _ZPositions = new List()
            {
                "Position1",
                "Position2",
                "Position3",
            };
            RPositions = new List()
            {
                "CW",
                "CCW",
            };
        }
        protected override void InvokeAfterUpdateProperty(Dictionary data)
        {
            InitData();
        }
        private void InitData()
        {
            ZAxisPosition1 = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position1");
            ZAxisPosition2 = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position2");
            ZAxisHomePosition = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position6");
            ZAxisProcessPosition = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position7");
            ZAxisPositiveLimit = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position8");
            ZAxisNegativeLimit = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Position9");
            ZAxisMoveSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.MoveSpeed");
            ZAxisAcc = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Acc");
            ZAxisDec = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatElevatorServo.Dec");
            
            _boatCycleCountSetPoint = (int)QueryDataClient.Instance.Service.GetConfig($"Boat.CycleCount");
            RAxisPosition45 = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.Position1");
            RAxisPosition90 = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.Position2");
            RAxisPosition180 = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.Position3");
            RAxisLoadPosition = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.Position4");
            RAxisMoveSpeed = (double)QueryDataClient.Instance.Service.GetConfig($"Boat.BoatRotationServo.MoveSpeed");
        }
        public void BoatZSaveValue(object obj, object tb)
        {
            switch (obj)
            {
                case "Position1":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position2":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position3":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position4":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position5":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position6":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position7":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position8":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position9":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "MoveSpeed":
                case "Acc":
                case "Dec":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatElevatorServo.{obj}", (tb as TextBox)?.Text);
                    break;
            }
        }
        public void BoatRSaveValue(object obj, object tb)
        {
            switch (obj)
            {
                case "Position1":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatRotationServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position2":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatRotationServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position3":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatRotationServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "Position4":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatRotationServo.{obj}", (tb as TextBox)?.Text);
                    break;
                case "MoveSpeed":
                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", $"Boat.BoatRotationServo.{obj}", (tb as TextBox)?.Text);
                    break;
            }
        }
        public void MoveTo(object targetPosition)
        {
            switch (targetPosition)
            {
                case "Position1":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position2":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position3":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position4":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position5":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position6":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
                case "Position7":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatElevatorServo.ServoMoveTo", targetPosition);
                    break;
            }
        }
        public void RAxisMoveTo(object targetPosition)
        {
            switch (targetPosition)
            {
                case "Position1":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatRotationServo.ServoMoveTo", targetPosition);
                    break;
                case "Position2":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatRotationServo.ServoMoveTo", targetPosition);
                    break;
                case "Position3":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatRotationServo.ServoMoveTo", targetPosition);
                    break;
                case "Position4":
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatRotationServo.ServoMoveTo", targetPosition);
                    break;
                default:
                    InvokeClient.Instance.Service.DoOperation($"PM1.BoatRotationServo.ServoMoveTo", targetPosition);
                    break;
            }
        }
        public void BoatZServoTest()
        {
            if (zPositionTranslate.Keys.Contains(ZAxisTestStartPosition) && zPositionTranslate.Keys.Contains(ZAxisTestStartPosition))
            {
                InvokeClient.Instance.Service.DoOperation($"Boat.ZAxisMovingTest", zPositionTranslate[ZAxisTestStartPosition], zPositionTranslate[ZAxisTestEndPosition]);
            }
            else
            {
                InvokeClient.Instance.Service.DoOperation($"Boat.ZAxisMovingTest", ZAxisTestStartPosition, ZAxisTestEndPosition);
            }
        }
        public void BoatRotationServoTest(object targetPosition)
        {
            InvokeClient.Instance.Service.DoOperation($"Boat.RAxisMovingTest", targetPosition);
        }
        public void BoatTestStart()
        {
            if (zPositionTranslate.Keys.Contains(ZAxisTestStartPosition) && zPositionTranslate.Keys.Contains(ZAxisTestStartPosition))
            {
                InvokeClient.Instance.Service.DoOperation($"Boat.MovingTest", zPositionTranslate[ZAxisTestStartPosition], zPositionTranslate[ZAxisTestEndPosition], RAxisTestDirection);
            }
            else
            {
                InvokeClient.Instance.Service.DoOperation($"Boat.MovingTest", ZAxisTestStartPosition, ZAxisTestEndPosition, RAxisTestDirection);
            }
            
        }
        public void BoatTestStop()
        {
            InvokeClient.Instance.Service.DoOperation($"Boat.Abort");
        }
        public void BoatRotationServoStopTest()
        {
            InvokeClient.Instance.Service.DoOperation($"Boat.Abort");
        }
        public void Home(object target)
        {
            InvokeClient.Instance.Service.DoOperation($"{target}.ServoHome");
        }
        public void SetServoOn(object target, object isOn)
        {
            InvokeClient.Instance.Service.DoOperation($"{target}", $"{isOn}");
        }
        public void Stop(object target)
        {
            InvokeClient.Instance.Service.DoOperation($"{target}.ServoStop");
        }
        public void Reset(object target)
        {
            InvokeClient.Instance.Service.DoOperation($"{target}.ServoResetAlarm");
        }
        public void SetOpen(object target, bool open)
        {
            // IsAutoDoorEnableManualOperation
            InvokeClient.Instance.Service.DoOperation($"{target}", open);
        }
    }
}