using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace HisenceYoloDetection
{
    public class DetectResultDisplay 
    {
        //深度学习 显示结果
        private List<DetectionResultDetail> mlResultList = null;
        public List<DetectionResultDetail> MLResultList
        {
            get => mlResultList;
            set
            {
                if (mlResultList != value)
                {
                    mlResultList = value;
                }
            }
        }

      

        string DisplayTxt = "";
        Bitmap ResultImage = null;
        PointF StartPoint = new PointF();
        Brush FontBrush = new SolidBrush(Color.Green);
        Pen DetectResultRectPen = new Pen(new SolidBrush(Color.Green));

        public Font Font { get; private set; }
        ResultState ResultState = ResultState.DetectNG;

        Font DetectResultFont = new Font(new FontFamily("Tahoma"), 15, GraphicsUnit.World);

        public int ImageWidth { get; set; }
        public int ImageHeight { get; set; }
        public DetectResultDisplay() { }

        //public DetectResultDisplay(NetResult result, List<IndexedSpec> specs, ResultState resultState, int imageWidth)
        //{
        //    ImageWidth = imageWidth;

        //    ResultState = resultState;

        //    displayTxt = resultState.ToString() + "\r\n";
        //    if (resultState != ResultState.OK)
        //    {
        //        fontBrush = new SolidBrush(Color.Red);
        //    }

        //    NetResult = result;
        //    SpecList = specs;

        //    Font = new Font(new FontFamily("Tahoma"), 35 * ImageWidth / 1400, GraphicsUnit.World);
        //    startPoint = new PointF(150 * ImageWidth / 1400, 150 * ImageWidth / 1400);
        //}

        public DetectResultDisplay(List<DetectionResultDetail> ResultDetails, Bitmap resultImage, string displayTxt)
        {
            ImageWidth = resultImage.Width;
            ImageHeight = resultImage.Height;
            var longSide = ImageWidth > ImageHeight ? ImageWidth : ImageHeight;

            MLResultList = ResultDetails;
          
            ResultImage = resultImage;
            DisplayTxt = displayTxt;
            if (ResultState != ResultState.OK)
            {
                FontBrush = new SolidBrush(Color.Red);
                DetectResultRectPen = new Pen(new SolidBrush(Color.Red));
            }
            Font = new Font(new FontFamily("Tahoma"), 35 * longSide / 1400, GraphicsUnit.World);
            DetectResultFont = new Font(new FontFamily("Tahoma"), 25 * longSide / 1400, GraphicsUnit.World);
            StartPoint = new PointF(100 * ImageWidth / 1400, 100 * ImageHeight / 1400);
        }

        public  object Clone()
        {
            return null;
        }


        public  void Draw(Graphics g)
        {
            //画检测结果图
            if (ResultImage != null && ResultState != ResultState.OK)
            {
                g.DrawImage(ResultImage, new Point(0, 0));
            }
            //画文字
            if (!string.IsNullOrWhiteSpace(DisplayTxt))
            {
                g.DrawString(DisplayTxt, Font, FontBrush, StartPoint);
            }
            //画外接矩形+label 深度学习
            if (MLResultList != null && MLResultList.Count > 0)
            {
                MLResultList.ForEach(d =>
                {
                    g.DrawRectangle(DetectResultRectPen, d.Rect);

                    string locationTxt = $"{d.LabelDisplay}";
                    var locationX = d.Rect.X;
                    var locationY = d.Rect.Y <= 20 ? d.Rect.Y + 20 : d.Rect.Y - 20;
                    g.DrawString(locationTxt, DetectResultFont, FontBrush, locationX, locationY);
                });
            }
            //画spec信息

            //if (DetectResult != null && DetectResult.NetResult?.DetectDetails?.Count > 0)
            //{
            //    DetectResult.NetResult?.DetectDetails.ForEach(d =>
            //    {
            //        g.DrawRectangle(defectRectPen, d.Rect);

            //        string locationTxt = $"{d.Rect.X},{d.Rect.Y}";
            //        g.DrawString(locationTxt, defectFont, fontBrush, d.Rect.X, d.Rect.Y - 5);
            //    });
            //}

            //float fontHeight = g.MeasureString(displayTxt, Font).Height;
            //startPoint.Y += fontHeight * 1.2f;

            //var defects = DetectResult.NetResult?.DetectDetails;
            //if (defects != null && defects.Count > 0)
            //{
            //    defects.ForEach(d =>
            //    {
            //        g.DrawString($"{d.ClassName} X:{d.Rect.X.ToString("f2")} Y:{d.Rect.Y.ToString("f2")} S:{d.Area}", Font, d.FinalResult == EnumHelper.ResultState.OK ? fontBrushOK : fontBrushNG, startPoint);

            //        startPoint.Y += fontHeight;
            //    });
            //}

            //DetectResult.Specs.ForEach(s =>
            //{
            //    g.DrawString($"{s.Code}:{(s.ActualValue ?? 0).ToString("f2")}", Font, s.MeasureResult ?? false == true ? fontBrushOK : fontBrushNG, startPoint);

            //    startPoint.Y += fontHeight;
            //});
        }

        public  string GetDisplayText()
        {
            return "";
        }

       
    }

    public class RectResultDisplay 
    {
        ResultState ResultState = ResultState.DetectNG;
        public string DisplayTxt = "";
        Color FillColor = Color.Lime;
        int FontSize = 15;
        RectangleF Rect = new RectangleF();
        bool IsFilled = false;

        public RectResultDisplay() { }

        public RectResultDisplay(ResultState _resultState, RectangleF _rect, string _displayTxt, Color _fillColor, bool _isFilled, int _fontSize)
        {
            ResultState = _resultState;
            Rect = _rect;
            DisplayTxt = _displayTxt;
            FillColor = _fillColor;
            IsFilled = _isFilled;
            FontSize = _fontSize;
        }

        public  object Clone()
        {
            RectResultDisplay rect = new RectResultDisplay();

            rect.ResultState = ResultState;
            rect.Rect = Rect;
            rect.DisplayTxt = DisplayTxt;
            rect.FillColor = FillColor;
            rect.FontSize = FontSize;
            rect.IsFilled = IsFilled;

            return rect;
        }

        public  void Draw(Graphics g)
        {
            g.DrawRectangle(new Pen(FillColor, 1), Rect.X, Rect.Y, Rect.Width, Rect.Height);

            if (IsFilled)
            {
                g.FillRectangle(new SolidBrush(Color.FromArgb(20, FillColor)), Rect);
            }

            Font font = new Font("Tahoma", FontSize);
            var txtSize = g.MeasureString(DisplayTxt, font);

            g.DrawString(DisplayTxt, font, new SolidBrush(FillColor), (float)(Rect.X + Rect.Width / 2.0 - txtSize.Width / 2.0), Rect.Y + Rect.Height + 5);
        }

        public  string GetDisplayText()
        {
            return $"{ResultState} {DisplayTxt} ({Rect.X},{Rect.Y},{Rect.Width},{Rect.Height})";
        }

      
    }
}