using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using Aitex.Core.Common.DeviceData;
using Caliburn.Micro;
namespace MECF.Framework.UI.Client.Ctrlib.UnitControls
{
    /// 
    /// Interaction logic for AnalogControl.xaml
    /// 
    public partial class MfcControl : UserControl
    {
        public MfcControl()
        {
            InitializeComponent();
        }
        // define dependency properties
        public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
                        "Command", typeof(ICommand), typeof(MfcControl),
                        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
        public static readonly DependencyProperty DeviceDataProperty = DependencyProperty.Register(
                        "DeviceData", typeof(AITMfcData), typeof(MfcControl),
                        new FrameworkPropertyMetadata(new AITMfcData(), FrameworkPropertyMetadataOptions.AffectsRender,
                        new PropertyChangedCallback(OnDeviceDataChanged)));
 
        public static readonly DependencyProperty BackColorProperty = DependencyProperty.Register(
                        "BackColor", typeof(Brush), typeof(MfcControl),
                         new FrameworkPropertyMetadata(Brushes.Green, FrameworkPropertyMetadataOptions.AffectsRender));
        public static readonly DependencyProperty HideDialogProperty = DependencyProperty.Register(
                    "HideDialog", typeof(bool), typeof(MfcControl),
                    new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
        private static void OnDeviceDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }
 
        public ICommand Command
        {
            get
            {
                return (ICommand)this.GetValue(CommandProperty);
            }
            set
            {
                this.SetValue(CommandProperty, value);
            }
        }
        /// 
        /// set, get current progress value AnalogDeviceData
        /// 
        public AITMfcData DeviceData
        {
            get
            {
                return (AITMfcData)this.GetValue(DeviceDataProperty);
            }
            set
            {
                this.SetValue(DeviceDataProperty, value);
            }
        }
        public Brush BackColor
        {
            get
            {
                return (Brush)this.GetValue(BackColorProperty);
            }
            set
            {
                this.SetValue(BackColorProperty, value);
            }
        }
 
        public bool HideDialog
        {
            get
            {
                return (bool)this.GetValue(HideDialogProperty);
            }
            set
            {
                this.SetValue(HideDialogProperty, value);
            }
        }
        //
        /// 
        /// MFC 控件的显示逻辑:
        ///
        /// 下面:设定值SetPoint
        /// 
        /// 
        /// 
        protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext);
            //draw background color
            rectBkground.Fill = BackColor;
            if (DeviceData != null)
            {
                rectBkground.Stroke = DeviceData.IsError ? Brushes.Red : (DeviceData.IsWarning ? Brushes.Yellow : Brushes.DimGray);
                labelValue.Content = DeviceData.FeedBack.ToString("F1");
                if (_dialog != null)
                {
                    _dialog.DeviceData = DeviceData;
                    _dialog.DeviceData.InvokePropertyChanged();
                }
                labelSetPoint.Content = DeviceData.SetPoint.ToString("F1");
            }
        }
        private MfcSettingDialogViewModel _dialog;
 
        private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (DeviceData == null)
                return;
            if (HideDialog)
                return;
            _dialog = new MfcSettingDialogViewModel($"MFC {DeviceData.DisplayName} Setting");
            _dialog.DeviceData = DeviceData;
            _dialog.InputSetPoint = DeviceData.SetPoint.ToString("F1");
            WindowManager wm = new WindowManager();
            Window owner  = Application.Current.MainWindow;
            if (owner != null)
            {
                Mouse.Capture(owner);
                Point pointToWindow = Mouse.GetPosition(owner);
                Point pointToScreen = owner.PointToScreen(pointToWindow);
                pointToScreen.X = pointToScreen.X + 50;
                pointToScreen.Y = pointToScreen.Y - 150;
                Mouse.Capture(null);
                wm.ShowDialog(_dialog, pointToScreen);
            }
            else
            {
                wm.ShowDialog(_dialog);
            }
        }
 
        private void Grid_MouseEnter(object sender, MouseEventArgs e)
        {
            if (DeviceData != null)
            {
                string tooltipValue =
                    $"{DeviceData.Type}:{DeviceData.DisplayName}\r\n\r\nID:{DeviceData.DeviceSchematicId}\r\nScale:{DeviceData.Scale} {DeviceData.Unit}\r\nSetPoint:{DeviceData.SetPoint} {DeviceData.Unit} \r\nFeedback:{DeviceData.FeedBack} {DeviceData.Unit}";
 
                ToolTip = tooltipValue;
            }
        }
    }
}