// OptimaView.cpp : implementation of the COptimaView class
//

#include "stdafx.h"
#include "Optima.h"

#include "OptimaDoc.h"
#include "OptimaView.h"
#include "Parser.h"
#include "Simplex.h"
#include "Fraction.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COptimaView

IMPLEMENT_DYNCREATE(COptimaView, CEditView)

BEGIN_MESSAGE_MAP(COptimaView, CEditView)
	//{{AFX_MSG_MAP(COptimaView)
	ON_COMMAND(ID_SOLVE, OnSolve)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COptimaView construction/destruction

COptimaView::COptimaView()
{
	// TODO: add construction code here

}

COptimaView::~COptimaView()
{
}

BOOL COptimaView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// COptimaView drawing

void COptimaView::OnDraw(CDC* pDC)
{
	COptimaDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// COptimaView printing

BOOL COptimaView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void COptimaView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void COptimaView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// COptimaView diagnostics

#ifdef _DEBUG
void COptimaView::AssertValid() const
{
	CEditView::AssertValid();
}

void COptimaView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

COptimaDoc* COptimaView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COptimaDoc)));
	return (COptimaDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// COptimaView message handlers

void COptimaView::OnSolve() 
{
	// TODO: Add your command handler code here

	Simplex simplex;
	Parser parser;
	int i,j,k,l;

	//AfxMessageBox("Going to Parse");
	parser.Parse((CEdit *)this,simplex);

	RECT r;

	r.left=10;
	r.top=10;
	r.right=200;
	r.bottom=300;


	
/*
	

	CWnd* p;
	p=GetTopLevelOwner();
	this->SendMessage(ID_FILE_OPEN);

	AfxGetApp()->SendMessage(ID_FILE_NEW);/
	::SendMessage

/*
	POSITION templ;
	CDocTemplate* doct;
	templ=AfxGetApp()->GetFirstDocTemplatePosition();
	templ=(doct=AfxGetApp()->GetNextDocTemplate(templ))->GetFirstDocPosition();

	CDocument* doc;
	//_______Get Last Document class
	do
	{
		doc=doct->GetNextDoc(templ);
	}
	while(templ!=NULL);


	//_____Get view  for this document____
	CView* view;
	templ=doc->GetFirstViewPosition();
	view=doc->GetNextView(templ);

	

  */

	

	CString data;
	GetWindowText(data);
	
	data+="\r\n\r\n			Starting Simplex Algorithm";
	data+="\r\n			__________________________\r\n\r\n";

	CString temp;
	char buffer[80];

	simplex.FillSimplexTable();

	//AfxMessageBox("Simplex TableFilled");

	//_________Display Variable Statistics_________
	data+=(CString)"\r\n\r\nNo. of variables ="+itoa(simplex.no_of_vars,buffer,10);
	data+=(CString)"\r\nNo. of slack variables ="+itoa(simplex.no_of_svars,buffer,10);
	data+=(CString)"\r\nNo. of artificial variables ="+itoa(simplex.no_of_avars,buffer,10);

	data+="\r\n\r\n";

	int it=0;
	int table_counter=1;

	if(simplex.phase_no==2)
		data+="\r\nPhase 1 Starting...\r\n-----------------";

	while(it==0 || it==-2)
	{
	

	
	//___Print Table No.__________
	itoa(table_counter++,buffer,10);
	data+="\r\n\r\nTable No: "+CString(buffer);
	data+="\r\n________________\r\n";

	//___First Row
	data+="\r\n"+GetPString("Val",11)+"  |";

	
	for(i=0;i<simplex.no_of_rvars;i++)
	{
		itoa(i+1,buffer,10);
		CString l=CString(buffer);
		
		if(simplex.var_const[i]==1) 
			l="x"+l;
		else if(simplex.var_const[i]==2) 
			l="-x"+l;
		else if(simplex.var_const[i]==3) 
		{
			CString m=l;
			l="x"+m+"+";
			data+=GetPString(l,9);
			l="x"+m+"-";

		}

		data+=GetPString(l,9);
	}
	
	for(i=simplex.no_of_vars;i<simplex.total_vars;i++)
	{
		CString l;
//______Slack vars___________
		
		if(i<(simplex.no_of_vars+simplex.no_of_svars)) 
		{
			itoa(i+1-simplex.no_of_vars,buffer,10);
			 l=CString(buffer);
		
			l="s"+l;			

		}
		else 
		{
			itoa(i+1-simplex.no_of_vars-simplex.no_of_svars,buffer,10);
			l=CString(buffer);

			l="a"+l;
	
		}
		
		
		data+=GetPString(l,9);
	}

	data+="\r\n";

	//_____Make dash Line_____
	for(i=0;i<(9*simplex.total_vars+12);i++)
		data+="_";

	//_____Print table___
	for(i=0;i<=simplex.no_of_const;i++)
	{
		
		//____if printing last row make horiz line____
		if(i==simplex.no_of_const)
		{
			data+="\r\n";
			//_____Make dash Line_____
			for(k=0;k<(9*simplex.total_vars+12);k++)
			data+="_";

		}


		data=data+"\r\n";
		for(int j=0;j<simplex.total_vars+1;j++)
		{
			//_gcvt(simplex.table[i][j],5,buffer);
			CString temp=simplex.table[i][j];
			if(temp.Right(1)==".") temp+="0";
			if(j==0)
				data=data+GetPString(temp,11)+"  |";
			else
				data=data+GetPString(temp,9);
		}
		
	}

	data=data+"\r\n\r\n";

	data+="Basic Vars = ";
	for(i=0;i<simplex.no_of_const;i++)
	{
		itoa(simplex.basic_vars[i],buffer,10);
		data=data+GetPString(CString(buffer),6);

	}

	data+="\r\n\r\n";

	SetWindowText((LPCTSTR)data);
	
	it=simplex.Iterate();

	if(it==-2)
		data+="\r\n\r\nPhase 2 Starting...\r\n---------------------";

	}

	if(it==1) 
	{
		AfxMessageBox("Optimal found !");
	}
	if(it==2) 
	{
		AfxMessageBox("Unbounded Sol !");
		data+=(CString)"\r\n\r\n"+"Unbounded Sol !";
	}
	if(it==-1) 
	{
		AfxMessageBox("Infeasible at end of Phase I !");
		data+=(CString)"\r\n\r\n"+"Infeasible at end of Phase I !";

	}

	
	if(it==1)
	{
	simplex.GenerateSolution();
	//_____Printing Final Solutions___
	data+="\r\n________________________________";
	data+="\r\n________FINAL SOLUTION__________";
	data+="\r\n________________________________";

	data+="\r\nOptimum Solution is  : "+(CString)simplex.finalsol[0];
	data+="\r\n\r\n";

	for(i=0;i<simplex.no_of_rvars;i++)
	{
		itoa(i+1,buffer,10);
		data+="\r\nVariable "+CString(buffer);
		data+=" : "+CString(simplex.finalsol[i+1]);
	}

	}




	
	SetWindowText((LPCTSTR)data);
	//itoa(it,buffer,10);
	//AfxMessageBox(CString(buffer));
	
}


CString COptimaView::GetPString(CString a, int n)
{

	a.TrimLeft();
	a.TrimRight();
	int l=a.GetLength();
	CString temp="";
	for(int i=0;i<n-l;i++)
		temp+=" ";

	temp+=a;

	//AfxMessageBox(temp);
	return temp;

	


}
