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

namespace bbiwarg
{
    class Constants
    {
        // BBIWARG
        public static readonly bool OutputTimerEnabled = true;
        public static readonly int OutputNumImages = 5;
        public static readonly int OutputNumImagesPerRow = 3;
        public static readonly float OutputScaleFactor = 1f; // output window size is scaled by this factor (from necessary size for images)


        // confidence image
        public static readonly int ConfidenceImageMinThreshold = 500;

        // depth image
        public static readonly int DepthImageMedianSize = 3;
        public static readonly int DepthImageDepthRange = 200; // <255

        // edge image
        public static readonly int EdgeImageCannyStartThreshold = 100;
        public static readonly int EdgeImageCannyLinkingThreshold = 75;
        public static readonly int EdgeImageCannySize = 3;
        public static readonly int EdgeImageRoughNumDilationIterations = 1;

        // finger detection
        public static readonly int FingerStepSize = 2;
        public static readonly int FingerMinNumSlices = 30 / FingerStepSize;
        public static readonly int FingerRemoveNumSlicesForCorrection = 5;
        public static readonly int FingerMaxGapCounter = 5;
        public static readonly int FingerMaxSliceDifferencePerStep = 5;
        public static readonly int FingerMaxSize = 30;
        public static readonly int FingerMinSize = 5;
        public static readonly int FingerNumSlicesForRelativeDirection = FingerRemoveNumSlicesForCorrection;
        public static readonly int FingerNumFramesUntilTracked = 2;
        public static readonly int FingerOutSliceFactor = 10;
        public static readonly int FingerContourMargin = 2;
        public static readonly int FingerSliceOverlapFactor = 2;
        public static readonly int FingerCrippleOutFactor = 8;
        public static readonly int FingerCrippleOutMinDifference = 15;
        public static readonly float FingerMinSimilarityForTracking = 0.75f;

        // hand detection
        public static readonly float HandMaxSize = 0.7f;

        // palm detection
        public static readonly float PalmMinDefectMidFingerLineDistance = 20; // defects with mid point ((start + end) / 2) closer than this to a finger line are removed 
        public static readonly float PalmMaxThumbDefectAngle = 110; // degree
        public static readonly float PalmMaxThumbDefectStartEndLengthQuotient = 2.3f;
        public static readonly float PalmMinThumbDefectStartEndLengthQuotient = 1.2f;
        public static readonly float PalmMinTumbDefectDepthThumbLengthQuotient = 0.8f;
        public static readonly float PalmMaxTumbDefectDepthThumbLengthQuotient = 1.2f;
        
        //palm Grid
        public static readonly int PalmGridRows = 3;
        public static readonly int PalmGridColumns = 3;

        // touch detection
        public static readonly float TouchEventMinFloodValue = 0.2f;
        public static readonly int TouchEventTipCorrectionFactor = 7;
        public static readonly int TouchEventAreaSize = 25;
        public static readonly int TouchEventNumFramesUntilTracked = 2;





        // colors
        public static readonly Color ColorDetected = Color.Green;
        public static readonly Color ColorTracked = Color.LightGoldenrodYellow;

        //public static readonly Color EdgeColor = Color.Blue; // edgeImage draw direct to blue chanel from outputImage

        public static readonly Color FingerSliceColor = Color.Magenta;
        public static readonly Color FingerDetectedColor = ColorDetected;
        public static readonly Color FingerTrackedColor = ColorTracked;
        public static readonly Color FingerTipOutSliceColor = Color.Gray;
        public static readonly Color FingerHandOutSliceColor = Color.DarkSlateGray;
        public static readonly Color FingerContourColor = Color.Red;

        public static readonly Color TouchEventDetectedColor = ColorDetected;
        public static readonly Color TouchEventTrackedColor = ColorTracked;
        public static readonly Color TouchEventTipColor = Color.CornflowerBlue;
        public static readonly Color TouchEventAreaMatchedSubtractColor = Color.DarkOrange;
        public static readonly Color TouchEventAreaNonMatchedSubtractColor = Color.DarkSlateGray;
        public static readonly Color TouchEventStatusBarColor = Color.Green;

        public static readonly Color TouchEventVisualizerLineColor = Color.White;
        public static readonly Color TouchEventVisualizerPointColor = Color.Red;

        public static readonly Color PalmQuadColor = Color.Blue;
        public static readonly Color PalmGridColor = Color.CornflowerBlue;
        public static readonly Color PalmConturColor = Color.Red;
        public static readonly Color PalmConvexHullColor = Color.Green;
        public static readonly Color PalmThumbDefectColor = Color.Lime;
    }
}