using MECF.Framework.Common.CommonData.Reservoir;
using MECF.Framework.Common.OperationCenter;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static System.Net.Mime.MediaTypeNames;
namespace PunkHPX8_Themes.UserControls
{
    /// 
    /// CrossDoseControl.xaml 的交互逻辑
    /// 
    public partial class CrossDoseControl : UserControl
    {
        public CrossDoseControl()
        {
            InitializeComponent();
        }
        #region 属性       
        public static readonly DependencyProperty ModuleNameProperty = DependencyProperty.Register(
              "ModuleName", typeof(string), typeof(CrossDoseControl), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// ModuleName
        /// 
        public string ModuleName
        {
            get
            {
                return (string)this.GetValue(ModuleNameProperty);
            }
            set
            {
                this.SetValue(ModuleNameProperty, value);
            }
        }
        public static readonly DependencyProperty ANTransferFlowProperty = DependencyProperty.Register(
              "ANTransferFlow", typeof(double), typeof(CrossDoseControl), new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// ANTransferFlow
        /// 
        public double ANTransferFlow
        {
            get
            {
                return (double)this.GetValue(ANTransferFlowProperty);
            }
            set
            {
                this.SetValue(ANTransferFlowProperty, value);
            }
        }
        public static readonly DependencyProperty RemainingFlowProperty = DependencyProperty.Register(
              "RemainingFlow", typeof(double), typeof(CrossDoseControl), new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// RemainingFlow
        /// 
        public double RemainingFlow
        {
            get
            {
                return (double)this.GetValue(RemainingFlowProperty);
            }
            set
            {
                this.SetValue(RemainingFlowProperty, value);
            }
        }
        public static readonly DependencyProperty ReservoirDataProperty = DependencyProperty.Register(
              "ReservoirData", typeof(CompactMembranReservoirData), typeof(CrossDoseControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// ReservoirData
        /// 
        public CompactMembranReservoirData ReservoirData
        {
            get
            {
                return (CompactMembranReservoirData)this.GetValue(ReservoirDataProperty);
            }
            set
            {
                this.SetValue(ReservoirDataProperty, value);
            }
        }
        public static readonly DependencyProperty PumpFactorProperty = DependencyProperty.Register(
              "PumpFactor", typeof(double), typeof(CrossDoseControl), new FrameworkPropertyMetadata(0.000, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// PumpFactor
        /// 
        public double PumpFactor
        {
            get
            {
                return (double)this.GetValue(PumpFactorProperty);
            }
            set
            {
                this.SetValue(PumpFactorProperty, value);
            }
        }
        public static readonly DependencyProperty IsCalibrateEnableProperty = DependencyProperty.Register(
              "IsCalibrateEnable", typeof(bool), typeof(CrossDoseControl), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// IsCalibrateEnable
        /// 
        public bool IsCalibrateEnable
        {
            get
            {
                return (bool)this.GetValue(IsCalibrateEnableProperty);
            }
            set
            {
                this.SetValue(IsCalibrateEnableProperty, value);
            }
        }
        public static readonly DependencyProperty TargetDosingVolumeProperty = DependencyProperty.Register(
              "TargetDosingVolume", typeof(double), typeof(CrossDoseControl), new FrameworkPropertyMetadata(0.00, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// TargetDosingVolume
        /// 
        public double TargetDosingVolume
        {
            get
            {
                return (double)this.GetValue(TargetDosingVolumeProperty);
            }
            set
            {
                this.SetValue(TargetDosingVolumeProperty, value);
            }
        }
        public static readonly DependencyProperty IsAutoModeProperty = DependencyProperty.Register(
              "IsAutoMode", typeof(bool), typeof(CrossDoseControl), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
        /// 
        /// IsAutoMode
        /// 
        public bool IsAutoMode
        {
            get
            {
                return (bool)this.GetValue(IsAutoModeProperty);
            }
            set
            {
                this.SetValue(IsAutoModeProperty, value);
            }
        }
        #endregion
        /// 
        /// 手动Dosing开始
        /// 
        /// 
        /// 
        private void Start_Click(object sender, RoutedEventArgs e)
        {
            if (requestVolume.Text != "")
            {
                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.StartDosing", double.Parse(requestVolume.Text));
            }
            
        }
        /// 
        /// 手动Dosing停止
        /// 
        /// 
        /// 
        private void Halt_Click(object sender, RoutedEventArgs e)
        {
            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.HaltDosing");
        }
        /// 
        /// 计算Pump Factor
        /// 
        /// 
        /// 
        private void Calibrate_Click(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrEmpty(counterVolume.Text) && !string.IsNullOrEmpty(requestVolume.Text))
            {
                double request = double.Parse(requestVolume.Text);
                if (request == 0) return;
                double pumpFactor = double.Parse(counterVolume.Text) / request;
                InvokeClient.Instance.Service.DoOperation($"{ModuleName}.SetPumpFactor", Math.Round(pumpFactor, 3));
            }
            
        }
        /// 
        /// Reset电机
        /// 
        /// 
        /// 
        private void Reset_Click(object sender, RoutedEventArgs e)
        {
            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.ResetCrossDose");
        }
        /// 
        /// 输入限制
        /// 
        /// 
        /// 
        /// 
        private void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
        {
            e.Handled = !IsTextAllowed(e.Text, ((TextBox) sender).Text);
        }
        private bool IsTextAllowed(string key, string text)
        {
            Regex regex = new Regex(@"^[0-9\.]+$");
            return regex.IsMatch(key);
        }
       
    }
}