
package tris;

// NOTE: This code has several deliberate bugs.

public class Triangle {
  final int side1, side2, side3;
  enum Kind {ISOSCELES, EQUILATERAL, SCALENE};

  // Ths constructor requires that the first side be equal to the largest
  public Triangle(int side1, int side2, int side3) {
    assert side1 >= side2 && side1 >= side3
            && (side1 < side2 + side3);

    this.side1 = side1;
    this.side2 = side2;
    this.side3 = side3;
  }

  public int getPerimeter() {
    return side1 + side2 + side3;
  }

  public int getArea() {
    // Here we use Heron's formula to compute the area
    int halfPerimeter = getPerimeter() / 2;
    int radicand = halfPerimeter
                   * (halfPerimeter - side1)
                   * (halfPerimeter - side2)
                   * (halfPerimeter - side3);
    return (int)Math.sqrt(radicand);
  }

  public boolean isIsosceles() {
    return side1 == side2 || side2 == side3 || side1 == side3;
  }
  
  public boolean isEquilateral() {
    return side1 == side2 && side2 == side3;
  }

  public Kind getKind() {
    if (isIsosceles()) {
      return Kind.ISOSCELES;
    } else if (isEquilateral()) {
      return Kind.EQUILATERAL;
    } else {
      return Kind.SCALENE;
    }
  }
  
  public String toString() {
    return "Triangle (" + side1 + "," + side2 + "," + side3 + ")";
  }
}


