public static void DrawGrid(SKCanvas canvas, GridSize gridSize, Padding padding, List <string> xAxis, List <string> yAxis, string title, List <string> secondYAxis = null)
        {
            // TODO consider what to do with the last entry -> add empty label?
            int columns = xAxis.Count - 1;
            int rows    = yAxis.Count - 1;


            var labelPaint = MediumTextPaint;

            // draw columns
            for (int i = 0; i <= columns; i++)
            {
                canvas.DrawText($"{xAxis[i]}", new SKPoint(gridSize.XMin + (i * (gridSize.XSize / columns)) - 25, gridSize.YMin + labelPaint.TextSize), labelPaint);

                if (i < columns)
                {
                    canvas.DrawLine(new SKPoint(gridSize.XMin + (i * (gridSize.XSize / columns)), gridSize.YMin), new SKPoint(gridSize.XMin + (i * (gridSize.XSize / columns)), gridSize.YMax), DefaultDrawing);
                }
            }
            canvas.DrawLine(new SKPoint(gridSize.XMax, gridSize.YMin), new SKPoint(gridSize.XMax, gridSize.YMax), DefaultDrawing);

            // draw rows
            for (int i = 0; i <= rows; i++)
            {
                var leftText = labelPaint;
                leftText.TextAlign = SKTextAlign.Right;

                canvas.DrawText($"{yAxis[i]}", new SKPoint(padding.Left - 5, padding.Top + gridSize.YSize - (gridSize.YSize / rows) * i + labelPaint.TextSize / 2), labelPaint);
                if (secondYAxis != null)
                {
                    canvas.DrawText($"{secondYAxis[i]}", new SKPoint(gridSize.XMax + 15, padding.Top + gridSize.YSize - (gridSize.YSize / rows) * i + labelPaint.TextSize / 2), labelPaint);
                }

                if (i < rows)
                {
                    canvas.DrawLine(new SKPoint(gridSize.XMin, padding.Top + gridSize.YSize - (gridSize.YSize / rows) * i), new SKPoint(gridSize.XMax, padding.Top + gridSize.YSize - (gridSize.YSize / rows) * i), DefaultDrawing);
                }
            }
            canvas.DrawLine(new SKPoint(gridSize.XMin, gridSize.YMax), new SKPoint(gridSize.XMax, gridSize.YMax), DefaultDrawing);

            // Draw title
            canvas.DrawText(title, new SKPoint(padding.Left, padding.Top / 2), TitleTextPaint);
        }
        public static List <SKPoint> GetPoints(Dictionary <DateTime, int> data, GridSize gridSize, bool yZeroIndexed = true, DateTime?minDate = null, DateTime?maxDate = null, bool overlapDays = false, int maxValue = -1)
        {
            // TODO implement overlap days

            List <SKPoint> dataPoints = new List <SKPoint>();



            // assume the dictionary is ordered
            // todo ensure that just in case

            DateTime firstDateTime = minDate ?? data.First().Key;
            DateTime lastDateTime  = maxDate ?? data.Last().Key;

            long totalSec = (long)(lastDateTime - firstDateTime).TotalSeconds; // sec granularity

            if (totalSec == 0)
            {
                return(dataPoints);
            }

            int minVal = int.MaxValue;
            int maxVal = int.MinValue;

            foreach (var item in data)
            {
                if (item.Value < minVal)
                {
                    minVal = item.Value;
                }
                if (item.Value > maxVal)
                {
                    maxVal = item.Value;
                }
            }

            if (yZeroIndexed)
            {
                minVal = 0;
            }

            // set max value incase its specified
            if (maxValue > 0)
            {
                maxVal = maxValue;
            }

            foreach (var item in data)
            {
                if (maxVal == 0)
                {
                    break;
                }

                long currentTotalSec = (long)(item.Key - firstDateTime).TotalSeconds; // sec granularity

                decimal xPercentage = currentTotalSec / (decimal)totalSec;
                decimal yPercentage = (item.Value - minVal) / (decimal)(maxVal - minVal);

                int xpos = (int)(gridSize.XSize * xPercentage) + gridSize.XMin;
                int ypos = gridSize.YSize - (int)(gridSize.YSize * yPercentage) + gridSize.YMax;

                dataPoints.Add(new SKPoint(xpos, ypos));
            }

            return(dataPoints);
        }