#include "stdafx.h"
#include "file_tmpl.h"


file_tmpl::file_tmpl(void)
{
}


file_tmpl::~file_tmpl(void)
{
}

file_tmpl& file_tmpl::set_project_name(const char* name)
{
	project_name_ = name;
	path_to_ = name;
	return *this;
}

file_tmpl& file_tmpl::set_path_from(const char* path)
{
	path_from_ = path;
	return *this;
}

tpl_t* file_tmpl::open_tpl(const char* filename)
{
	tpl_t* tpl = tpl_alloc();
	string filepath;
	filepath.format("%s/%s", path_from_.c_str(), filename);
	if (tpl_load(tpl, filepath.c_str()) != TPL_OK)
	{
		printf("load file %s error: %s\r\n",
			filepath.c_str(), last_serror());
		tpl_free(tpl);
		return NULL;
	}
	return tpl;
}

bool file_tmpl::copy_and_replace(const char* from,
	const char* to, bool exec /* = false */)
{
	tpl_t* tpl = open_tpl(from);
	if (tpl == NULL)
		return false;

	tpl_set_field_fmt_global(tpl, "PROGRAM", "%s", project_name_.c_str());

	string filepath;
	filepath << path_to_ << '/' << to;
	if (tpl_save_as(tpl, filepath.c_str()) != TPL_OK)
	{
		printf("save to %s error: %s\r\n", filepath.c_str(),
			last_serror());
		tpl_free(tpl);
		return false;
	}
	printf("create %s ok.\r\n", filepath.c_str());
	tpl_free(tpl);

	if (exec)
	{
#ifndef	WIN32
		chmod(filepath.c_str(), S_IRUSR | S_IWUSR | S_IXUSR |
			S_IRGRP | S_IWGRP | S_IXGRP);
#endif
	}
	return true;
}

void file_tmpl::create_dirs()
{
	acl_make_dirs(project_name_.c_str(), 0755);
}

bool file_tmpl::create_common()
{
	if (copy_and_replace("Makefile", "Makefile") == false)
		return false;
	if (copy_and_replace("valgrind.sh", "valgrind.sh", true) == false)
		return false;

	string file;

	// for vc2003
	file.format("%s.sln", project_name_.c_str());
	if (copy_and_replace("master_service.sln", file.c_str()) == false)
		return false;
	file.format("%s.vcproj", project_name_.c_str());
	if (copy_and_replace("master_service.vcproj", file.c_str()) == false)
		return false;

	// for vc2008
	file.format("%s_vc2008.sln", project_name_.c_str());
	if (copy_and_replace("master_service_vc2008.sln", file.c_str()) == false)
		return false;
	file.format("%s_vc2008.vcproj", project_name_.c_str());
	if (copy_and_replace("master_service_vc2008.vcproj", file.c_str()) == false)
		return false;

	// for vc2010
	file.format("%s_vc2010.sln", project_name_.c_str());
	if (copy_and_replace("master_service_vc2010.sln", file.c_str()) == false)
		return false;
	file.format("%s_vc2010.vcxproj", project_name_.c_str());
	if (copy_and_replace("master_service_vc2010.vcxproj", file.c_str()) == false)
		return false;
	file.format("%s_vc2010.vcxproj.filters", project_name_.c_str());
	if (copy_and_replace("master_service_vc2010.vcxproj.filters", file.c_str()) == false)
		return false;

	// for vc2012
	file.format("%s_vc2012.sln", project_name_.c_str());
	if (copy_and_replace("master_service_vc2012.sln", file.c_str()) == false)
		return false;
	file.format("%s_vc2012.vcxproj", project_name_.c_str());
	if (copy_and_replace("master_service_vc2012.vcxproj", file.c_str()) == false)
		return false;
	file.format("%s_vc2012.vcxproj.filters", project_name_.c_str());
	if (copy_and_replace("master_service_vc2012.vcxproj.filters", file.c_str()) == false)
		return false;

	const char* name = "common_files";
	const FILE_FROM_TO tab[] = {
		{ "stdafx.h", "stdafx.h" },
		{ "stdafx.cpp", "stdafx.cpp" },
		{ NULL, NULL }
	};

	return files_copy(name, tab);
}

bool file_tmpl::file_copy(const char* from, const char* to_in)
{
	string to_buf;
	to_buf.format("%s/%s", path_to_.c_str(), to_in);

	const char* to = to_buf.c_str();

	if (strcasecmp(from, to) == 0)
	{
		printf("from(%s) == to(%s)\r\n", from, to);
		return false;
	}

	ifstream in;
	if (in.open_read(from) == false)
	{
		printf("open %s error: %s\r\n", from, last_serror());
		return false;
	}

	ofstream out;
	if (out.open_write(to) == false)
	{
		printf("open %s error: %s\r\n", from, last_serror());
		return false;
	}

	string buf;

	while (!in.eof())
	{
		if (in.gets(buf, false) == false)
			break;
		if (out.write(buf) < 0)
		{
			printf("write to %s error: %s\r\n", to, last_serror());
			return false;
		}
	}

	printf("create %s ok\r\n", to);
	return true;
}

bool file_tmpl::files_copy(const char* name, const FILE_FROM_TO* tab)
{
	string from, to;

	from = "tmpl/Makefile.in";
	to.format("%s/Makefile.in", path_to_.c_str());

	if (file_copy(from.c_str(), "Makefile.in") == false)
		return false;

	for (size_t i = 0; tab[i].from != NULL; i++)
	{
		from.format("%s/%s", path_from_.c_str(), tab[i].from);
		//to.format("%s/%s", path_to_.c_str(), tab[i].to);
		if (file_copy(from, tab[i].to) == false)
		{
			printf("create %s failed!\r\n", name);
			return false;
		}
	}

	printf("create %s ok!\r\n", name);
	return true;
}
