using SkiaSharp;
using System;
using System.Collections.Generic;
using System.Text;

namespace DataDisplay.Common
{
  public class PointMapping
  {
    public PointMapping(double width,double height,double xDataExtent,double xDataExtentMin,double yDataExtent,double yDataExtentMin,double xMarginExtent=0.00,double yMarginExtent=0.00)
    {
      Width=width;
      Height=height;
      XMargin=xMarginExtent;
      YMargin=yMarginExtent;
      XDataExtent=xDataExtent;
      XDataExtentMin=xDataExtentMin;
      YDataExtent=yDataExtent;
      YDataExtentMin=yDataExtentMin;
      XScalingFactor=(Width-(XMargin*2))/(XDataExtent-XDataExtentMin);
      YScalingFactor=(Height-(YMargin*2))/(YDataExtent-YDataExtentMin);
    }
// MapPoint will both scale the given point and translate the given point from an upper left origin system to a bottom left origin system
    public SKPoint MapPoint(SKPoint sourcePoint)
    {
      SKPoint mappedPoint=new SKPoint((float)((sourcePoint.X-XDataExtentMin)*XScalingFactor),(float)(Height-((sourcePoint.Y-YDataExtentMin)*YScalingFactor)));
      mappedPoint.X+=(float)XMargin;   // offset by the xMargin
      mappedPoint.Y-=(float)YMargin;   // offset by the yMargin
      return mappedPoint;
    }
// TranslatePoint will only translate the given point from an upper left origin system to a bottom left origin system
    public SKPoint TranslatePoint(SKPoint sourcePoint)
    {
      SKPoint mappedPoint=new SKPoint((float)sourcePoint.X,(float)(Height-sourcePoint.Y-1));
      return mappedPoint;
    }
    public double Width{get;private set;}
    public double Height{get;private set;}
    public double XDataExtent{get;private set;}
    public double XDataExtentMin{get;private set;}
    public double XRange{get{return XDataExtent-XDataExtentMin;}}
    public double YDataExtent{get;private set;}
    public double YDataExtentMin{get;private set;}
    public double YRange{get{return YDataExtent-YDataExtentMin;}}
    public double XMargin{get;private set;}
    public double YMargin{get;private set;}
    public double XScalingFactor{get;private set;}
    public double YScalingFactor{get;private set;}
  }
}
