using System;
using System.Globalization;

namespace ReallifeGamemode.Server.Core.API
{
  public class Position
  {
    public double X { get; set; }

    public double Y { get; set; }

    public double Z { get; set; }

    public Position()
    {
      X = 0.0;
      Y = 0.0;
      Z = 0.0;
    }

    public Position(double x, double y, double z)
    {
      X = x;
      Y = y;
      Z = z;
    }

    public Position(float x, float y, float z)
    {
      X = x;
      Y = y;
      Z = z;
    }
    public Position(decimal x, decimal y, decimal z)
    {
      X = (double)x;
      Y = (double)y;
      Z = (double)z;
    }

    public Position(int x, int y, int z)
    {
      X = x;
      Y = y;
      Z = z;
    }

    public Position Add(Position toAdd)
    {
      return new Position(X + toAdd.X, Y + toAdd.Y, Z + toAdd.Z);
    }

    public Position Subtract(Position toSubtract)
    {
      return new Position(X - toSubtract.X, Y - toSubtract.Y, Z - toSubtract.Z);
    }

    public double DistanceTo(Position position)
    {
      var x = position.X - X;
      var y = position.Y - Y;
      var z = position.Z - Z;

      return Math.Sqrt(x * x + y * y + z * z);
    }

    public override string ToString()
    {
      var x = Math.Round(this.X, 2).ToString(CultureInfo.InvariantCulture);
      var y = Math.Round(this.Y, 2).ToString(CultureInfo.InvariantCulture);
      var z = Math.Round(this.Z, 2).ToString(CultureInfo.InvariantCulture);

      return $"{x}, {y}, {z}";
    }
  }
}
