using MECF.Framework.Common.OperationCenter;
using MECF.Framework.Common.SubstrateTrackings;
using MECF.Framework.UI.Client.Annotations;
using System;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
namespace FurnaceUI.Controls.Parts
{
    /// 
    /// CassetteView.xaml 的交互逻辑
    /// 
    public partial class CassetteViewV2 : UserControl, INotifyPropertyChanged
    {
        public bool DiSensorValue
        {
            get { return (bool)GetValue(DiSensorValueProperty); }
            set { SetValue(DiSensorValueProperty, value); }
        }
        public static readonly DependencyProperty DiSensorValueProperty =
            DependencyProperty.Register("DiSensorValue", typeof(bool), typeof(CassetteViewV2), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.AffectsRender));
        public string CarrierModule
        {
            get { return (string)GetValue(CarrierModuleProperty); }
            set
            {
                SetValue(CarrierModuleProperty, value);
            }
        }
        public static readonly DependencyProperty CarrierModuleProperty =
            DependencyProperty.Register("CarrierModule", typeof(string), typeof(CassetteViewV2), new PropertyMetadata("System"));
        public int CarrierSlot
        {
            get { return (int)GetValue(CarrierSlotProperty); }
            set
            {
                SetValue(CarrierSlotProperty, value);
            }
        }
        public static readonly DependencyProperty CarrierSlotProperty =
            DependencyProperty.Register("CarrierSlot", typeof(int), typeof(CassetteViewV2), new PropertyMetadata(0));
        public CarrierInfo CarrierData
        {
            get { return (CarrierInfo)GetValue(CarrierDataProperty); }
            set
            {
                SetValue(CarrierDataProperty, value);
            }
        }
        public static readonly DependencyProperty CarrierDataProperty =
            DependencyProperty.Register("CarrierData", typeof(CarrierInfo), typeof(CassetteViewV2), new PropertyMetadata(new CarrierInfo(1), CarrierDataChangedCallback));
        public string CassetteType
        {
            get { return (string)GetValue(CassetteTypeProperty); }
            set
            {
                SetValue(CassetteTypeProperty, value);
            }
        }
        // Using a DependencyProperty as the backing store for CassetteType.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CassetteTypeProperty =
            DependencyProperty.Register("CassetteType", typeof(string), typeof(CassetteViewV2), new PropertyMetadata(""));
        public int WaferCount
        {
            get { return (int)GetValue(WaferCountProperty); }
            set
            {
                SetValue(WaferCountProperty, value);
            }
        }
        // Using a DependencyProperty as the backing store for WaferCount.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty WaferCountProperty =
            DependencyProperty.Register("WaferCount", typeof(int), typeof(CassetteViewV2), new PropertyMetadata(0));
        private string _cassetteStatus;
        /// 
        /// Foup的状态,如果在Processing中会显示绿色
        /// 其他状态根据waferType定义显示颜色
        /// 
        public string CassetteStatus
        {
            get { return _cassetteStatus; }
            set
            {
                if (_cassetteStatus != value)
                {
                    _cassetteStatus = value;
                    OnPropertyChanged();
                }
            }
        }
        //P(P1,P2),M1(M,M1),M2,SD,ED,V,R(R1,R2),Process
        public double oldScale = 0;
        public static void CarrierDataChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var selfView = (CassetteViewV2)d;
            var carrierInfo = (CarrierInfo)e.NewValue;
            var moduleName = selfView.CarrierModule;
        }
        public CassetteViewV2()
        {
            InitializeComponent();
        }
        public event PropertyChangedEventHandler PropertyChanged;
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public void Filp(int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null)
        {
            var storyboard = new Storyboard();
            storyboard.Completed += (s, e) => onComplete?.Invoke();
            if (Filp(storyboard, filp, angle, absolute, ms, accelerationRatio, decelerationRatio, onComplete))
            {
                storyboard.Begin();
            }
            else
            {
                onComplete?.Invoke();
            }
        }
        public bool Filp(Storyboard storyboard, int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null)
        {
            var newScale = 0.5;
            if (newScale == oldScale)
            {
                return false;
            }
            ScaleTransform scaleTransform = new ScaleTransform();
            if (filp == 180)
            {
                scaleTransform.ScaleX = -1;
            }
            else
            {
                scaleTransform.ScaleX = 1;
            }
            TransformGroup Group = new TransformGroup();
            Group.Children.Add(scaleTransform);
            tbWaferCount.RenderTransform = Group;
            tbWaferCount.RenderTransformOrigin = new Point(0.5, 0.5);
            var animation = new DoubleAnimation(oldScale, angle, TimeSpan.FromMilliseconds(ms));
            animation.AccelerationRatio = accelerationRatio;
            animation.DecelerationRatio = decelerationRatio;
            storyboard.Children.Add(animation);
            Storyboard.SetTarget(animation, tbWaferCount);
            Storyboard.SetTargetProperty(animation, new PropertyPath("RenderTransform.(TransformGroup.Children)[0].(TranslateTransform.X)"));
            oldScale = angle;
            return true;
        }
        private void CreateCassette(object sender, RoutedEventArgs e)
        {
            InvokeClient.Instance.Service.DoOperation("System.CreateCarrier", CarrierModule, 0);
        }
        private void DeleteCassette(object sender, RoutedEventArgs e)
        {
            InvokeClient.Instance.Service.DoOperation("System.DeleteCarrier", CarrierModule, 0);
        }
    }
}