// fsout.cpp: implementation of the fsout(output)
// class.
//////////////////////////////////////////////////////////////////////

#include "fsout.h"
#include "common.h"

extern bool Insert(int *dstSet, int &dstLen, int item);

FSout::FSout(char *filename)
{
  out = fopen(filename,"wt");
	//fopen_s(&out, filename, "wt");
}

FSout::~FSout()
{
  if(out) fclose(out);
}

int FSout::isOpen()
{
  if(out) return 1;
  else return 0;
}

void swapInt(int* k, int* j)
{
	int temp;
	temp = *j;
	*j = *k;
	*k = temp;
}


//for debug
void inssort(int* array, int i, int j)
{
	for (int k=j-1; k>=i; k--)
		for (int m=k; (m<j) && (array[m] > array[m+1]); m++)
		{
			swapInt(array+m, array+m+1);
		}
}

void FSout::printSet(int length, int *iset, int support, int posCount)
{
#ifdef _DEBUG
  int *temp =new int[length];
  for(int j=0;j<length;j++)
  {
      temp[j]=order_item[iset[j]];
  }
  inssort(temp,0, length-1);
#endif

  for(int i=0; i<length; i++) 
  {
#ifdef _DEBUG
	fprintf(out, "%d ", temp[i]);
#else
	fprintf(out, "%d ", order_item[iset[i]]);
#endif
  }
  fprintf(out, "(%d, %d) ", posCount, support-posCount);

#ifdef _DEBUG
  delete temp;
#endif

//#endif
}

void FSout::printSet(int length, int *iset, int support)
{
	int *temp =new int[length+fullNum];
	int tlen = 0;
	for(;tlen<length;tlen++)
	{
		temp[tlen]=order_item[iset[tlen]];
	}
	//need to insert full items anymore
	if(fullNum)
	{
		for(int j=0;j<fullNum;j++)
			Insert(temp, tlen, fullItem[j]);
	}
	
	inssort(temp,0, tlen-1);
	
	for(int i=0; i<tlen; i++) 
		fprintf(out, "%d ", temp[i]);
	
	if(support>0)
		fprintf(out, "(%d) ", support);
	
	
	delete temp;
}

void FSout::printKeySet(int length, int* iset, int support)
{
	int *temp =new int[length];
	int tlen = 0;
	for(;tlen<length;tlen++)
	{
		temp[tlen]=order_item[iset[tlen]];
	}
	
	inssort(temp,0, tlen-1);
	
	for(int i=0; i<tlen; i++) 
		fprintf(out, "%d ", temp[i]);
	
	if(support>0)
		fprintf(out, "(%d) ", support);
	
	
	delete temp;
} 

void FSout::printset(int length, int *iset)
{
//#ifdef shown 
  for(int i=0; i<length; i++) 
    fprintf(out, "%d ", order_item[iset[i]]);
//#endif
}


void FSout::close()
{
	fclose(out);
}

void FSout::printString(char *str)
{
     fprintf(out,str);
}
  
void FSout::printTime(char *str,double time)
{
	fprintf(out,str);
	fprintf(out,": %f",time);
}

void FSout::printDigit(int dig)
{
	fprintf(out, "%d", dig);
}

void FSout::printTid(int *tidSet, int tidLength)
{	
	if(tidSet==NULL)
	{
		fprintf(out, "\n");
		return;
	}

	for(int i=0; i<tidLength; i++)
	{
		if(tidSet[i]>=0)
			fprintf(out, "%d ", tidSet[i]);
	}

	fprintf(out, "\n");

}

void FSout::printOrderSet(int length, int *iset, int support)
{ 
  for(int i=0; i<length; i++) 
  {
	if(iset[i] < NET_ITEM_NO-fullNum) //remove full item
	  fprintf(out, "%d ", iset[i]);
  }
  if(support>=0)
	fprintf(out, "(%d)", support);
}

void FSout::printOrderItem()
{
	//for(int i=0; i<NET_ITEM_NO; i++)
	for(int i=0; i<VALID_ITEM_NO; i++)
	{
		fprintf(out, "%d ", order_item[i]);
	}
	fprintf(out, "\n");
}

void FSout::printItem(int item)
{
	fprintf(out, "%d ", item);
}

void FSout::printCount()
{
	for(int i=0; i<NET_ITEM_NO; i++)
	{
		fprintf(out, "%d ", item_support[i]);
	}
	fprintf(out, "\n");
}
