#include <iostream>
#include <time.h>
#include "graph_holder.h"

extern void press_enter();

edge_vertex::edge_vertex(int l_poin, int r_point, int tot_edges) : 
	left_points(l_poin), right_points(r_point), edges(tot_edges)	{

	try{
	
		int i;
		
		// allocating the matrix
		
		edge_graph = new char* [left_points + right_points];

		for (i=0; i < left_points+right_points; i++)	{
			edge_graph[i] = new char [edges];
			memset (edge_graph[i], 0, edges*sizeof (char));
		}
	}
	catch (...)	{
		std::cout << "Out of memory";
	}
	std::cout << "edge_graph created\n";
	
}

edge_vertex::~edge_vertex()	{
		int i;

		for (i=0; i < left_points+right_points; i++)
			delete[]	edge_graph[i];
		delete[] edge_graph;
		
	}


void edge_vertex::print_graph()	{

	int i, j;

	std::cout << "edge_vertex_graph:\n";
	
	for (i=0; i < left_points + right_points; i++)	{
		for (j=0; j < edges; j++)
			std::cout <<  (int )edge_graph[i][j] << " ";
		std::cout << "\n";
	}
	return;
}

void edge_vertex::set_edge_graph(char **graph)	{
	
	int i, b_column;
	int edge = 0;

	for (i=0; i < left_points; i++)
		for (b_column=0;  b_column < right_points; b_column++)	{
			if (graph[i][b_column])	{
				edge_graph[i][edge] = 1;
				edge_graph[left_points + b_column][edge] = 1;
				edge++;
			}
		}
	return;
}

int edge_vertex::decode (int *input_vec, int vec_len)	{
	int i, j, tt, ln_indx;

	
	char  *vec_cpy = new char [vec_len];
	int *line = new int [edges];

	while (1)	{

		//	 int k = compute_size();
		//std::cout << "\n k is  " << k;
		
		memcpy (vec_cpy, input_vec, vec_len);
		
		for (i=0; i < left_points; i++)	{
			ln_indx = 0;
			for (j=0;  j < edges; j++)	{
				if (edge_graph[i][j])	
					line [ln_indx++]=j;
			}
			index(i,line,ln_indx);
			decode_left(input_vec, line, ln_indx );
		}

		std::cout << "\n vector received, After Decode Left: \n";

		for (tt =0; tt < vec_len; tt++)	
			std::cout << input_vec [tt] << " ";
		
		press_enter();
		
		for (; i < left_points + right_points; i++)	{
			ln_indx = 0;
			for (j=0;  j < edges; j++)	{
				if (edge_graph[i][j])	
					line [ln_indx++]=j;
			}
		//std::cout << " left points is   " << left_points;	
		//std::cout << "\n right points is  " << right_points;	
		//std::cout << "\n left points plus right points  " << left_points + right_points;
		//std::cout << "\n edges is  " << edges;	
			index(i,line,ln_indx);
			decode_right(input_vec, line, ln_indx);
		}
		std::cout << "\n vector received, After Decode Right: \n";

		for (tt =0; tt < vec_len; tt++)	
			std::cout << input_vec [tt] << " ";
		
		press_enter();
		
		if (! memcmp(vec_cpy, input_vec, vec_len))
			break;
	}

	delete[] vec_cpy;
	delete[] line;

	return (1);
}

int edge_vertex::decode_left (int *input_vec, int *line, int ln_index)	{
	
	int i;

	for (i=0; i < ln_index; i++)	
		input_vec[line[i]] +=1;
	
	
	return (1);

	}

int edge_vertex::decode_right (int *input_vec, int *line, int ln_index)	{

	int i;

//std::cout << "\n total is  " << total;	
	for (i=0; i < ln_index; i++)	
		input_vec[line[i]] +=2;
	
	
	return (1);

	}

//int edge_vertex::compute_size() {
//
//	int k=0;
//	int i,j;
//	for (i =0; i < left_points; i++) {
//		for (j=0; j< left_points + right_points;j++) {
//			k = k+edge_graph[i][j];
//		}
//	}

//return k;
//}

void edge_vertex::index(int q, int *line, int ln_index) { 
	int i,j;
	int sum = 0;
	for (i=0;i <= q-1; i++) {
		for (j=0; j < edges; j++) {
             sum = sum + edge_graph[i][j];
		}
	}
	std::cout << "\n i is " << q;
	std::cout << "\n sum is " << sum;

	for (i=0;i < ln_index;i++) {
		line[i] = sum + i;
		
        std::cout << "\n line[" << i;
		std::cout << "] is " << line[i];
	}



	return;

}

