using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace FurnaceUI.Controls
{
    /// 
    /// wpf专用的辅助工具类
    /// 
    public class WpfUtils
    {
        /// 
        /// 将winform的color转换为wpf的颜色信息
        /// 
        /// winform的颜色信息
        /// wpf的颜色
        public static Color TransMediaColor(System.Drawing.Color color)
        {
            return Color.FromArgb(color.A, color.R, color.G, color.B);
        }
        /// 
        /// 将点进行转换
        /// 
        /// 点位
        /// 点位
        public static System.Drawing.PointF[] TransMediaPoints(Point[] points)
        {
            System.Drawing.PointF[] points1 = new System.Drawing.PointF[points.Length];
            for (int i = 0; i < points.Length; i++)
            {
                points1[i] = new System.Drawing.PointF((float)points[i].X, (float)points[i].Y);
            }
            return points1;
        }
        /// 
        /// 将点进行转换
        /// 
        /// 点位
        /// 点位
        public static Point[] TransMediaPoints(System.Drawing.Point[] points)
        {
            Point[] points1 = new Point[points.Length];
            for (int i = 0; i < points.Length; i++)
            {
                points1[i] = new Point((float)points[i].X, (float)points[i].Y);
            }
            return points1;
        }
        /// 
        /// 将点进行转换
        /// 
        /// 点位
        /// 点位
        public static System.Drawing.PointF[] TransMediaPoints(List points)
        {
            return TransMediaPoints(points.ToArray());
        }
        public static System.Drawing.Color TransDrawingColor(Color color)
        {
            return System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);
        }
        public static Line DrawLine(Canvas canvas, Point point1, Point point2, Color color, double thickness)
        {
            return DrawLine(canvas, point1.X, point1.Y, point2.X, point2.Y, color, thickness);
        }
        public static Line DrawLine(Canvas canvas, Point point1, Point point2, Color color, double thickness, double[] dashArray)
        {
            return DrawLine(canvas, point1.X, point1.Y, point2.X, point2.Y, color, thickness, dashArray);
        }
        public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Color color, double thickness)
        {
            return DrawLine(canvas, x1, y1, x2, y2, new SolidColorBrush(color), thickness);
        }
        public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Brush brush, double thickness)
        {
            Line line = new Line();
            line.X1 = x1;
            line.Y1 = y1;
            line.X2 = x2;
            line.Y2 = y2;
            line.StrokeThickness = thickness;
            line.Stroke = brush;
            canvas.Children.Add(line);
            return line;
        }
        public static Line DrawLine(Canvas canvas, double x1, double y1, double x2, double y2, Color color, double thickness, double[] dashArray)
        {
            Line line = new Line();
            line.X1 = x1;
            line.Y1 = y1;
            line.X2 = x2;
            line.Y2 = y2;
            line.StrokeDashArray = new DoubleCollection(dashArray);
            line.StrokeThickness = thickness;
            line.Stroke = new SolidColorBrush(color);
            canvas.Children.Add(line);
            return line;
        }
        public static Ellipse DrawEllipse(Canvas canvas, double x, double y, double width, double height, Color color, double thickness)
        {
            Ellipse ellipse = new Ellipse();
            ellipse.Width = width;
            ellipse.Height = height;
            canvas.Children.Add(ellipse);
            Canvas.SetLeft(ellipse, x);
            Canvas.SetTop(ellipse, y);
            ellipse.StrokeThickness = thickness;
            ellipse.Stroke = new SolidColorBrush(color);
            return ellipse;
        }
        public static Ellipse DrawEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Color color, double thickness)
        {
            return DrawEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color, thickness);
        }
        #region Fill Rectangle
        public static Rectangle FillRectangle(Canvas canvas, double x, double y, double width, double height, Color color)
        {
            return FillRectangle(canvas, x, y, width, height, new SolidColorBrush(color));
        }
        public static Rectangle FillRectangle(Canvas canvas, double x, double y, double width, double height, Brush brush)
        {
            if (width >= 0 && height >= 0)
            {
                Rectangle ellipse = new Rectangle();
                ellipse.Width = width;
                ellipse.Height = height;
                canvas.Children.Add(ellipse);
                Canvas.SetLeft(ellipse, x);
                Canvas.SetTop(ellipse, y);
                ellipse.Fill = brush;
                return ellipse;
            }
            return null;
        }
        public static Rectangle FillRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Color color)
        {
            return FillRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color);
        }
        public static Rectangle FillRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Brush brush)
        {
            return FillRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, brush);
        }
        public static Rectangle DrawRectangle(Canvas canvas, double x, double y, double width, double height, Color color, float penWidth)
        {
            if (width >= 0 && height >= 0)
            {
                Rectangle rectangle = new Rectangle();
                rectangle.Width = width;
                rectangle.Height = height;
                rectangle.StrokeThickness = penWidth;
                rectangle.Stroke = new SolidColorBrush(color);
                canvas.Children.Add(rectangle);
                Canvas.SetLeft(rectangle, x);
                Canvas.SetTop(rectangle, y);
                return rectangle;
            }
            return null;
        }
        public static Rectangle DrawRectangle(Canvas canvas, System.Drawing.RectangleF rectangle, Color color, float penWidth)
        {
            return DrawRectangle(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color, penWidth);
        }
        #endregion
        #region Fill Ellipse
        public static Ellipse FillEllipse(Canvas canvas, double x, double y, double width, double height, Color color)
        {
            return FillEllipse(canvas, x, y, width, height, new SolidColorBrush(color));
        }
        public static Ellipse FillEllipse(Canvas canvas, double x, double y, double width, double height, Brush brush)
        {
            Ellipse ellipse = new Ellipse();
            ellipse.Width = width;
            ellipse.Height = height;
            canvas.Children.Add(ellipse);
            Canvas.SetLeft(ellipse, x);
            Canvas.SetTop(ellipse, y);
            ellipse.Fill = brush;
            return ellipse;
        }
        public static Ellipse FillEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Color color)
        {
            return FillEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, color);
        }
        public static Ellipse FillEllipse(Canvas canvas, System.Drawing.RectangleF rectangle, Brush brush)
        {
            return FillEllipse(canvas, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, brush);
        }
        #endregion
        public static Polyline DrawLines(Canvas canvas, Point[] points, Color color, double thickness, double[] dashArray = null)
        {
            Polyline polylines = new Polyline();
            polylines.Points = new PointCollection(points);
            polylines.StrokeThickness = thickness;
            polylines.Stroke = new SolidColorBrush(color);
            if (dashArray != null)
                polylines.StrokeDashArray = new DoubleCollection(dashArray);
            canvas.Children.Add(polylines);
            return polylines;
        }
        public static void DrawLines(Canvas canvas, Point[] points, HslCurveItem line, int pointsRadius)
        {
            if (points.Length < 2) return;
            if (line.Style == CurveStyle.LineSegment || line.Style == CurveStyle.Curve)
            {
                DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness);
            }
            else if (line.Style == CurveStyle.LineDot || line.Style == CurveStyle.CurveDot)
            {
                DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 1, 1 });
            }
            else if (line.Style == CurveStyle.CurveDash || line.Style == CurveStyle.LineDash)
            {
                DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 2, 2 });
            }
            else if (line.Style == CurveStyle.CurveLongDath || line.Style == CurveStyle.LineLongDath)
            {
                DrawLines(canvas, points, WpfUtils.TransMediaColor(line.LineColor), line.LineThickness, new double[] { 5, 5 });
            }
            else if (line.Style == CurveStyle.StepLine)
            {
                PointCollection collects = new PointCollection();
                for (int i = 0; i < points.Length - 1; i++)
                {
                    Point center = new Point(points[i + 1].X, points[i].Y);
                    collects.Add(points[i]);
                    collects.Add(center);
                }
                collects.Add(points[points.Length - 1]);
                DrawLines(canvas, collects.ToArray(), WpfUtils.TransMediaColor(line.LineColor), line.LineThickness);
            }
            else
            {
                for (int i = 0; i < points.Length - 1; i++)
                {
                    Point center = new Point(points[i + 1].X, points[i].Y);
                    Line line1 = new Line();
                    line1.X1 = points[i].X;
                    line1.Y1 = points[i].Y;
                    line1.X2 = center.X;
                    line1.Y2 = center.Y;
                    line1.StrokeThickness = line.LineThickness;
                    line1.Stroke = new SolidColorBrush(WpfUtils.TransMediaColor(line.LineColor));
                    canvas.Children.Add(line1);
                }
            }
            if (pointsRadius > 0 && pointsRadius < 20)
            {
                for (int i = 0; i < points.Length; i++)
                {
                    FillEllipse(canvas, points[i].X - pointsRadius, points[i].Y - pointsRadius, pointsRadius * 2, pointsRadius * 2, WpfUtils.TransMediaColor(line.LineColor));
                }
            }
        }
        public static Path DrawCurve(Canvas canvas, Point[] points, Color color, double thickness)
        {
            Path path = new Path();
            path.StrokeThickness = thickness;
            path.Stroke = new SolidColorBrush(color);
            canvas.Children.Add(path);
            return path;
        }
        public static Polygon FillPolygon(Canvas canvas, Point[] points, Color color)
        {
            return FillPolygon(canvas, points, new SolidColorBrush(color));
        }
        public static Polygon FillPolygon(Canvas canvas, Point[] points, Brush brush)
        {
            Polygon polygon = new Polygon();
            polygon.Points = new PointCollection(points);
            polygon.Fill = brush;
            canvas.Children.Add(polygon);
            return polygon;
        }
        public static Polygon DrawPolygon(Canvas canvas, Point[] points, Color color, float penWidth)
        {
            Polygon polygon = new Polygon();
            polygon.Points = new PointCollection(points);
            polygon.StrokeThickness = penWidth;
            polygon.Stroke = new SolidColorBrush(color);
            canvas.Children.Add(polygon);
            return polygon;
        }
        public static Polygon FillTriangle(Canvas canvas, Point point, Color color, int size, GraphDirection direction)
        {
            Point[] points = new Point[4];
            if (direction == GraphDirection.Leftward)
            {
                points[0] = new Point(point.X, point.Y - size);
                points[1] = new Point(point.X, point.Y + size);
                points[2] = new Point(point.X - 2 * size, point.Y);
            }
            else if (direction == GraphDirection.Rightward)
            {
                points[0] = new Point(point.X, point.Y - size);
                points[1] = new Point(point.X, point.Y + size);
                points[2] = new Point(point.X + 2 * size, point.Y);
            }
            else if (direction == GraphDirection.Upward)
            {
                points[0] = new Point(point.X - size, point.Y);
                points[1] = new Point(point.X + size, point.Y);
                points[2] = new Point(point.X, point.Y - 2 * size);
            }
            else
            {
                points[0] = new Point(point.X - size, point.Y);
                points[1] = new Point(point.X + size, point.Y);
                points[2] = new Point(point.X, point.Y + 2 * size);
            }
            points[3] = points[0];
            return FillPolygon(canvas, points, color);
        }
        public static void DrawString(Canvas canvas, string text, Color color, System.Drawing.RectangleF rectangle, HorizontalAlignment horizontal, VerticalAlignment vertical)
        {
            DrawString(canvas, text, color, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, horizontal, vertical);
        }
        public static void DrawString(Canvas canvas, string text, Brush brush, System.Drawing.RectangleF rectangle, HorizontalAlignment horizontal, VerticalAlignment vertical)
        {
            DrawString(canvas, text, brush, rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height, horizontal, vertical);
        }
        public static void DrawString(Canvas canvas, string text, Color color, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
        {
            DrawString(canvas, text, new SolidColorBrush(color), x, y, width, height, horizontal, vertical);
        }
        public static void DrawString(Canvas canvas, string text, Brush foreground, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
        {
            Label label = new Label();
            label.Width = width;
            label.Height = height;
            label.Foreground = foreground;
            label.HorizontalContentAlignment = horizontal;
            label.VerticalContentAlignment = vertical;
            label.Content = text;
            canvas.Children.Add(label);
            label.Style = null;
            Canvas.SetLeft(label, x);
            Canvas.SetTop(label, y);
        }
        public static void DrawString(Canvas canvas, string text, Brush foreground, double fontSize, double x, double y, double width, double height, HorizontalAlignment horizontal, VerticalAlignment vertical)
        {
            Label label = new Label();
            label.Width = width;
            label.Height = height;
            label.FontSize = fontSize;
            label.Foreground = foreground;
            label.HorizontalContentAlignment = horizontal;
            label.VerticalContentAlignment = vertical;
            label.Content = text;
            canvas.Children.Add(label);
            Canvas.SetLeft(label, x);
            Canvas.SetTop(label, y);
        }
    }
}