using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Text;
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;

namespace FLY.ControlLibrary
{
    /// <summary>
    /// PercentRing.xaml 的交互逻辑
    /// </summary>
    public partial class PercentRing : UserControl, INotifyPropertyChanged
    {
        #region 附加属性
        /// <summary>
        /// 比例
        /// </summary>
        public static readonly DependencyProperty RatioProperty =
            DependencyProperty.Register("Ratio", typeof(double), typeof(PercentRing), new PropertyMetadata(0.3,
                new PropertyChangedCallback(delegate (DependencyObject d, DependencyPropertyChangedEventArgs e)
            {

            })));
        /// <summary>
        /// 比例
        /// </summary>
        public double Ratio { 
            get
            {
                return (double)GetValue(RatioProperty);
            }
            set
            {
                SetValue(RatioProperty, value);
                NotifyPropertyChanged("Ratio");
            }
        }

        /// <summary>
        /// 总量
        /// </summary>
        public static readonly DependencyProperty TotalProperty =
            DependencyProperty.Register("Total", typeof(double), typeof(PercentRing), new PropertyMetadata(1.0));
        /// <summary>
        /// 总量
        /// </summary>
        public double Total
        {
            get
            {
                return (double)GetValue(RatioProperty);
            }
            set
            {
                if (value != Total)
                {
                    SetValue(RatioProperty, value);
                    NotifyPropertyChanged("Total");
                }
            }
        }

        /// <summary>
        /// 字的颜色
        /// </summary>
        public static readonly DependencyProperty ColorTextProperty =
            DependencyProperty.Register("ColorText", typeof(Brush), typeof(PercentRing), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(0x46,0x46,0x46))));
        /// <summary>
        /// 字的颜色
        /// </summary>
        public Brush ColorText
        {
            get
            {
                return (Brush)GetValue(ColorTextProperty);
            }
            set
            {
                if (value != ColorText)
                {
                    SetValue(ColorTextProperty, value);
                    NotifyPropertyChanged("ColorText");
                }
            }
        }
        
        /// <summary>
        /// 单位的颜色
        /// </summary>
        public static readonly DependencyProperty ColorUnitProperty =
            DependencyProperty.Register("ColorUnit", typeof(Brush), typeof(PercentRing), new PropertyMetadata(new SolidColorBrush(Color.FromRgb(0x46, 0x46, 0x46))));
        /// <summary>
        /// 单位的颜色
        /// </summary>
        public Brush ColorUnit
        {
            get
            {
                return (Brush)GetValue(ColorUnitProperty);
            }
            set
            {
                if (value != ColorUnit)
                {
                    SetValue(ColorUnitProperty, value);
                    NotifyPropertyChanged("ColorUnit");
                }
            }
        }


        #endregion
        
        /// <summary>
        /// 
        /// </summary>
        public PercentRing()
        {
            InitializeComponent();
            //this.DataContext = this;
            Draw();

        }
        void Draw()
        {
            arc_value.DataContext = this;
            run_value.DataContext = this;
            run_unit.DataContext = this;
        }
        #region INotifyPropertyChanged 成员
        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }
    public class Percent2AngleConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is double))
                return 0;
            double d = (double)value;
            return d * 360; 
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    public class Percent2AngleMultiConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2)
                return 0;
            if (!(values[0] is double))
                return 0;
            if (!(values[1] is double))
                return 0;
            double d = (double)values[0] / ((double)values[1]);
            return d * 360;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    public class PercentConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (!(value is double))
                return 0;
            double d = (double)value;
            return d * 100;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    public class PercentMultiConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2)
                return 0;
            if (!(values[0] is double))
                return 0;
            if (!(values[1] is double))
                return 0;
            double d = (double)values[0] / ((double)values[1]);
            return d * 100;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    public class TestUnit_PercentRing
    {
        public double Ratio { get; set; }
        public double Total { get; set; }
        public Brush ColorText { get; set; }
        public Brush ColorUnit { get; set; }
    }
}
