#include "figure.h"

//Abstract data type Figure with methods for initializing and
//displaying the chacteristics of Figure instances.

void Figure::Create()
//Creates figure with blank string as value of Name field.
{
  strset(OneFig.Name, ' ');
}

void Figure::Init(FigKind ShapeVal, float Val1, float Val2)
//
//Pre : Figure has been created.
//Post: Object is defined with union tag member FigKind set
//      to ShapeVal. If object has one data member, Val1 is
//      stored in it and Val2 is ignored; otherwise Val1 and
//      Val2 are stored.
{
  OneFig.Shape = ShapeVal;
  switch (OneFig.Shape)
  {
    case Circle:
      strcpy(OneFig.Name, "Circle");
      OneFig.Radius = Val1;
      break;
    case Rectangle:
      strcpy(OneFig.Name, "Rectangle");
      OneFig.Rec.Width = Val1;
      OneFig.Rec.Length = Val2;
      break;
    case Square:
      strcpy(OneFig.Name, "Square");
      OneFig.Side = Val1;
      break;
    case Triangle:
      strcpy(OneFig.Name, "Triangle");
      OneFig.Tri.Base = Val1;
      OneFig.Tri.Height = Val2;
      break;
  }
}

void Figure::ComputePerim()
//Defines the value of object data member Perimeter.
//Pre : Union tage member is defined and characteristics of
//	object are defined.
//Post: Assigns value to Perimeter data member.
{
  switch(OneFig.Shape)
  {
    case Circle:
      OneFig.Perimeter = 2 * M_PI * OneFig.Radius;
      break;
    case Rectangle:
      OneFig.Perimeter =
	     2 * (OneFig.Rec.Width + OneFig.Rec.Length);
      break;
    case Square:
      OneFig.Perimeter = 4 * OneFig.Side;
      break;
    case Triangle:
      OneFig.Perimeter =
	     //pow() to raise to a power
	     OneFig.Tri.Base + OneFig.Tri.Height +
	     sqrt(pow(OneFig.Tri.Base, 2.0) +
		  pow(OneFig.Tri.Height, 2.0));
      break;
  }
}

void Figure::ComputeArea()
//Defines the value of object data member Area.
//Pre : Union tage member is defined and characteristics of
//	object are defined.
//Post: Assigns value to Area data member.
{
  switch(OneFig.Shape)
  {
    case Circle:
      OneFig.Area = M_PI * pow(OneFig.Radius, 2.0);
      break;
    case Rectangle:
      OneFig.Area = OneFig.Rec.Width * OneFig.Rec.Length;
      break;
    case Square:
      OneFig.Area = pow(OneFig.Side, 2.0);
      break;
    case Triangle:
      OneFig.Area = 0.5 * OneFig.Tri.Base * OneFig.Tri.Height;
      break;
  }
}

char *Figure::GetName()
//Returns value of date member Name.
{
  char* Name = new char[Size + 1];
  strcpy(Name, OneFig.Name);
  //can also use
  //char* nam;
  // nam=strdup(onefig.name);
  return(Name);
}

float Figure::GetArea()
//Returns value of data member Area.
{
  return(OneFig.Area);
}

float Figure::GetPerim()
//Returns value of data member Perimeter.
{
  return(OneFig.Perimeter);
}

float Figure::GetFirstVar()
//Retrieves the value of first object dimension.
{
  float X;

  switch(OneFig.Shape)
  {
    case Circle:
      X = OneFig.Radius;
      break;
    case Rectangle:
      X = OneFig.Rec.Length;
      break;
    case Square:
      X = OneFig.Side;
      break;
    case Triangle:
      X = OneFig.Tri.Base;
      break;
  }
  return(X);
}

float Figure::GetSecondVar()
//Returns value of second dimension, if defined;
//otherwise returns 0.
{
  float X;

  switch(OneFig.Shape)
  {
    case Circle:
      X = 0;
      break;
    case Rectangle:
      X = OneFig.Rec.Length;
      break;
    case Square:
      X = 0;
      break;
    case Triangle:
      X = OneFig.Tri.Base;
      break;
  }
  return(X);
}

void Figure::Display()
//Displays object data members.
//Pre : All required data members are defined.
//Post: Each data member has been displayed.
{
  int Equal;

  //check for blank string as Name value
  Equal = strncmp(OneFig.Name, " ", 1);

  if (!Equal)
   cout << "Figure kind is not defined\n";
  else
  {
    cout << "Figure kind is " << OneFig.Name << "\n";
    cout << "Area is " << OneFig.Area << "\n";
    cout << "Perimeter is " << OneFig.Perimeter << "\n";

    switch(OneFig.Shape)
    {
      case Circle:
	cout << "Radius is " << OneFig.Radius <<"\n";
	break;
      case Rectangle:
	cout << "Width is " << OneFig.Rec.Width << "\n";
	cout << "Length is " << OneFig.Rec.Length << "\n";
	break;
      case Square:
	cout << "Side is " << OneFig.Side << "\n";
	break;
      case Triangle:
	cout << "Base is " << OneFig.Tri.Base << "\n";
	cout << "Height is " << OneFig.Tri.Height << "\n";
    }
  }
}
