//
// File:   getConfigFilename.cpp
//
// Author: fatray
//
// Created on 05 December 2007, 23:39
//
// FIXME: portability


// I hacked include<string> on to silence my compiler, is it valid?
#include <string>
#include <cstring>
#include <cstdlib>
#include "getConfigFilename.h"
#include <fcntl.h>	
#include <sys/stat.h>
#include <cstdio>

// get the full pathname of a configfile
std::string getConfigFilename()
{
	char num[512];
	FILE *in;
	FILE *out;
	
	char* home;
	// FIXME: fixed length buffers are not ideal.
	char projectM_home[1024];
	char projectM_config[1024];
	
	strcpy(projectM_config, PROJECTM_PREFIX);
	strcpy(projectM_config + strlen(PROJECTM_PREFIX), CONFIG_FILE);
	projectM_config[strlen(PROJECTM_PREFIX) + strlen(CONFIG_FILE)] = '\0';
	printf("dir:%s \n", projectM_config);
	home = getenv("HOME");
	strcpy(projectM_home, home);
	strcpy(projectM_home + strlen(home), "/.projectM/config.inp");
	projectM_home[strlen(home) + strlen("/.projectM/config.inp")] = '\0';
	
	if ((in = fopen(projectM_home, "r")))
	{
		printf("reading ~/.projectM/config.inp \n");
		fclose(in);
		return std::string(projectM_home);
	}
	
	printf("trying to create ~/.projectM/config.inp \n");
	
	projectM_home[strlen(home) + strlen("/.projectM")] = '\0';
	mkdir(projectM_home, 0755);
	
	strcpy(projectM_home + strlen(home), "/.projectM/config.inp");
	projectM_home[strlen(home) + strlen("/.projectM/config.inp")] = '\0';
	
	if((out = fopen(projectM_home, "w")))
	{
		if ((in = fopen(projectM_config, "r")))
		{
			while(fgets(num, 80, in)!=NULL)
			{
				fputs(num, out);
			}
			fclose(in);
			fclose(out);
			
			
			if ((in = fopen(projectM_home, "r")))
			{
				printf("created ~/.projectM/config.inp successfully\n");
				fclose(in);
				return std::string(projectM_home);
			}
			
			printf("This shouldn't happen, using implementation defaults\n");
			abort();
		}
		printf("Cannot find projectM default config, using implementation defaults\n");
		abort();
	}
	
	printf("Cannot create ~/.projectM/config.inp, using default config file\n");
	if ((in = fopen(projectM_config, "r")))
	{
		printf("Successfully opened default config file\n");
		fclose(in);
		return std::string(projectM_config);
	}
	
	printf("Using implementation defaults, your system is really messed up, I'm suprised we even got this far\n");
	abort();
}

