#include <fstream>
using namespace std;

#include <commandline.h>
#include <plane.h>
#include <planetest.h>
#include <point.h>
#include <print.h>


void planetest::test01(int argc, char** argv)
{

  point3<double> p0(1.0,0.0,0.0);
  point3<double> p1(2.0,-3.0,1.0);
  point3<double> p2(0.0,-2.0,0.0);

  commandline cmd(argc,argv);

  cmd.mapvar(p0.x,"p0.x");
  cmd.mapvar(p0.y,"p0.y");
  cmd.mapvar(p0.z,"p0.z");
  cmd.mapvar(p1.x,"p1.x");
  cmd.mapvar(p1.y,"p1.y");
  cmd.mapvar(p1.z,"p1.z");
  cmd.mapvar(p2.x,"p2.x");
  cmd.mapvar(p2.y,"p2.y");
  cmd.mapvar(p2.z,"p2.z");

  cout << SHOW(p0) << endl;
  cout << SHOW(p1) << endl;
  cout << SHOW(p2) << endl;

  bool valid;
  plane p(valid,p0,p1,p2);

  cout << SHOW(valid) << endl;

  cout << (string)p << endl;

}

void planetest::test02(int argc, char** argv)
{
  cout << "Solve Plane to Plane Intersection." << endl;

  plane P1( point3<double>(0.0,0.0,1.0), 1.0 );
  plane P2( point3<double>(0.0,1.0,0.0), 0.0 );

  cout << "P1: " << (string)P1 << endl;
  cout << "P2: " << (string)P2 << endl;

  point3<double> A;
  point3<double> B;

  cout << SHOW(P1.intersects(A,B,P2)) << endl;
  cout << SHOW(A) << endl;
  cout << SHOW(B) << endl;
  cout << "(" << A << ") + (" << B << ")t" << endl;

  cout << "Is a point on the line also on the plane?" << endl;
  cout << "Enter t:  ";
  double t;
  cin >> t;
  point3<double> p = A + B*t;
  cout << SHOW(p) << endl;
  cout << SHOW(P1.isPointOnPlane(p)) <<endl;
  cout << SHOW(P2.isPointOnPlane(p)) <<endl;
}

void planetest::test03(int argc, char** argv)
{
  commandline cmd(argc,argv);

  string in;
  string out; 

  cmd.mapvar(in,"in");
  if (in.empty())
  {
    cout << "error: in=filename1 out=filename2 expected" << endl;
    return;
  }

  ifstream filein(in.c_str());
  assert(filein.good()==true);
  if (filein.good()==false)
    return;

/*
  ofstream fileout(out.c_str());
  assert(fileout.good()==true);
  if (fileout.good()==false)
    return;
*/

  point3<double> nml;
  double d;

  filein >> nml.x;
  filein >> nml.y;
  filein >> nml.z;
  filein >> d;

  plane P1(nml,d);

  filein >> nml.x;
  filein >> nml.y;
  filein >> nml.z;
  filein >> d;

  plane P2(nml,d);

  //cout << SHOW(nml) << endl;
  //cout << SHOW(d) << endl;
  
  point3<double> A;
  point3<double> B;

  cout << "P1: " << (stringc)P1 << endl;
  cout << "P2: " << (stringc)P2 << endl;

  bool res = P1.intersects(A,B,P2);
  cout << SHOW(res) << endl;

  cout << "(" << A << ") + (" << B << ")t" << endl;

  cout << SHOW(A) << endl;
  cout << SHOW(A+B) << endl;
  cout << SHOW(P1.isPointOnPlane(A)) << endl;
  cout << SHOW(P1.isPointOnPlane(A+B)) << endl;
  cout << SHOW(P2.isPointOnPlane(A)) << endl;
  cout << SHOW(P2.isPointOnPlane(A+B)) << endl;



/*
  if (res==true)
  {
    fileout << "1" << endl;
    fileout << A << endl;
    fileout << B << endl;
  }
  else
  {
    fileout << "0" << endl;
  }
*/

}




