#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include "atoms.h"
#include "header.h"

int main(int argc, char** argv)
{
	Headerinfo tempheader;
	Atom tempatom;
	FILE* file1;
	FILE* file2;
	int i,j,k;
	char buffer[255];
	double sizemul;
	double cutoff;
	double curX, curY, curZ;

	if(argc < 2)
	{
		printf("no infile specified\n\n");
		return 0;
	}

	for(k=1; k<argc; k++)
	{
		file1 = fopen(argv[k], "rb");

		if(file1 == NULL)
		{
			printf("failed to open infile %s for reading\n\n", argv[k]);
			return errno;
		}
		
		printf("using infile %s\n\n", argv[k]);

		j = (int)fread(&tempheader, sizeof(Headerinfo), 1, file1);

		if(j < 1)
		{
			printf("error reading header from infile\n\n");
			return 0;
		}

		sprintf(buffer, "%s.pov", argv[k]);

		file2 = fopen(buffer, "w");

		sizemul = max(tempheader.bigX, max(tempheader.bigY, tempheader.bigZ));
		if(sizemul <= 0.0)
		{
			fprintf(file2, "crash HARD and die\n");
			fclose(file2);
			fclose(file1);
			return 5;
		}
		sizemul = 1/sizemul;
		cutoff = tempheader.mincutoff * sizemul;

		curX = tempheader.bigX*sizemul;
		curY = tempheader.bigY*sizemul;
		curZ = tempheader.bigZ*sizemul;

		fprintf(file2, "#include \"colors.inc\"\n\n");
		fprintf(file2, "camera {\n\tlocation <%f, %f, %f>\n\tlook_at <%f, %f, %f>\n}\n\n", 0.1+0.5*curX, 0.7+0.5*curY, -(0.8+0.5*curZ), 0.5*curX, 0.5*curY, 0.5*curZ);
		fprintf(file2, "light_source { <10, 10, -10>, White }\n\n");
		fprintf(file2, "background { color Black }\n\n");

		fprintf(file2, "cylinder { <0.0, -0.025, -0.025>, <0.0, -0.025, -0.025> + <%f, 0.0, 0.0>, 0.01 pigment { Green } }\n\n", 1.0E-9*sizemul);
		fprintf(file2, "cylinder { <0.0, -0.025, -0.025>, <0.0, -0.025, -0.025> + <%f, 0.0, 0.0>, 0.011 pigment { GreenCopper } }\n\n", 1.0E-10*sizemul);

		fprintf(file2, "cylinder { <0.0, 0.0, 0.0>, <%f, 0.0, 0.0>, 0.002 pigment { Red } }\n", curX);
		fprintf(file2, "cylinder { <0.0, 0.0, 0.0>, <0.0, %f, 0.0>, 0.002 pigment { Red } }\n", curY);
		fprintf(file2, "cylinder { <0.0, 0.0, 0.0>, <0.0, 0.0, %f>, 0.002 pigment { Red } }\n", curZ);

		fprintf(file2, "cylinder { <%f, 0.0, 0.0>, <%f, 0.0, %f>, 0.002 pigment { Red } }\n", curX, curX, curZ);
		fprintf(file2, "cylinder { <%f, 0.0, 0.0>, <%f, %f, 0.0>, 0.002 pigment { Red } }\n", curX, curX, curY);

		fprintf(file2, "cylinder { <0.0, %f, 0.0>, <0.0, %f, %f>, 0.002 pigment { Red } }\n", curY, curY, curZ);
		fprintf(file2, "cylinder { <0.0, %f, 0.0>, <%f, %f, 0.0>, 0.002 pigment { Red } }\n", curY, curX, curY);

		fprintf(file2, "cylinder { <0.0, 0.0, %f>, <%f, 0.0, %f>, 0.002 pigment { Red } }\n", curZ, curX, curZ);
		fprintf(file2, "cylinder { <0.0, 0.0, %f>, <0.0, %f, %f>, 0.002 pigment { Red } }\n", curZ, curY, curZ);

		fprintf(file2, "cylinder { <%f, %f, %f>, <0.0, %f, %f>, 0.002 pigment { Red } }\n", curX, curY, curZ, curY, curZ);
		fprintf(file2, "cylinder { <%f, %f, %f>, <%f, 0.0, %f>, 0.002 pigment { Red } }\n", curX, curY, curZ, curX, curZ);
		fprintf(file2, "cylinder { <%f, %f, %f>, <%f, %f, 0.0>, 0.002 pigment { Red } }\n", curX, curY, curZ, curX, curY);
		fprintf(file2, "\n\n");

		for(i=0; i< (sizeof(elements)/sizeof(elements[0])); i++)
		{
			fprintf(file2, "#macro %s(center)\n", elements[i].symbol);
			fprintf(file2, "\tsphere { center, %f pigment { %s } }\n", elements[i].radius*sizemul, elements[i].pigment);
			fprintf(file2, "#end\n");
		}
		fprintf(file2, "\n");

		for(i=0; i<tempheader.numatoms; i++)
		{
			j = (int)fread(&tempatom, sizeof(Atom), 1, file1);

			if(j < 1)
			{
				printf("error reading atom %d from infile\n\n", i);
				return 3;
			}

			curX = sizemul * tempatom.x;
			curY = sizemul * tempatom.y;
			curZ = sizemul * tempatom.z;
			
			fprintf(file2, "%s( <%f,%f,%f> )\n", elements[tempatom.type].symbol, curX, curY, curZ);
		}

		fclose(file2);
		fclose(file1);
	}

	return 1;
}

