using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tesseract;

namespace Test_Merge
{
    public class ConfigurationTool
    {
        public Zone MainZone;
        public const int NUMBER_OF_DRIVERS = 20;
        public const int NUMBER_OF_ZONES = 9;

        public ConfigurationTool(Bitmap fullImage,Rectangle mainZoneDimensions)
        {
            MainZone = new Zone(fullImage,mainZoneDimensions);
            AutoCalibrate();
        }
        public void AddWindows(List<Rectangle> rectangles)
        {
            foreach (Zone driverZone in MainZone.Zones)
            {
                Bitmap zoneImage = driverZone.ZoneImage;

                for (int i = 1; i <= rectangles.Count; i++)
                {
                    switch (i)
                    {
                        case 1:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverPositionWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 2:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverGapToLeaderWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 3:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverLapTimeWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 4:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverDrsWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 5:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverTyresWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 6:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverNameWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 7:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 8:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                        case 9:
                            //First zone should be the driver's Position
                            driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i]));
                            break;
                    }
                }
            }
        }
        public void AutoCalibrate()
        {
            List<Rectangle> detectedText = new List<Rectangle>();
            List<Zone> zones = new List<Zone>();

            TesseractEngine engine = new TesseractEngine(Window.TESS_DATA_FOLDER.FullName, "eng", EngineMode.Default);
            Image image = MainZone.ZoneImage;
            var tessImage = Pix.LoadFromMemory(Window.ImageToByte(image));

            Page page = engine.Process(tessImage);
            using (var iter = page.GetIterator())
            {
                iter.Begin();
                do
                {
                    Rect boundingBox;
                    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out boundingBox))
                    {
                        //var text = iter.GetText(PageIteratorLevel.Word).ToUpper();
                        //We remove all the rectangles that are definitely too big
                        if (boundingBox.Height < image.Height / NUMBER_OF_DRIVERS)
                        {
                            //Now we add a filter to only get the boxes in the right because they are much more reliable in size
                            if (boundingBox.X1 > image.Width / 2)
                            {
                                //Now we check if an other square box has been found roughly in the same y axis
                                bool match = false;
                                //The tolerance is roughly half the size that a window will be
                                int tolerance = (image.Height / NUMBER_OF_DRIVERS) / 2;

                                foreach (Rectangle rect in detectedText)
                                {
                                    if (rect.Y > boundingBox.Y1 - tolerance && rect.Y < boundingBox.Y1 + tolerance)
                                    {
                                        //There already is a rectangle in this line
                                        match = true;
                                    }
                                }
                                //if nothing matched we can add it
                                if (!match)
                                    detectedText.Add(new Rectangle(boundingBox.X1, boundingBox.Y1, boundingBox.Width, boundingBox.Height));
                            }
                        }
                    }
                } while (iter.Next(PageIteratorLevel.Word));
            }
            foreach (Rectangle Rectangle in detectedText)
            {
                Rectangle windowRectangle;
                Size windowSize = new Size(image.Width, image.Height / NUMBER_OF_DRIVERS);
                Point windowLocation = new Point(0, (Rectangle.Y + Rectangle.Height / 2) - windowSize.Height / 2);
                windowRectangle = new Rectangle(windowLocation, windowSize);
                //We add the driver zones
                MainZone.AddZone(new Zone(MainZone.ZoneImage, windowRectangle));
            }
        }
    }
}
