#include "jidu_envConfig.h"
#include <direct.h>
#include "MyStringUtils.h"
#include "jidu_dataCenter.h"
#include "dirent.h"

EnvConfig* EnvConfig::instance;
EnvConfig::EnvConfig()
{
	struct stat sb;
	if (stat("useProd.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Prod;
	}
	else if (stat("useDmaProd.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Prod;
	}
	else if (stat("useStaging.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("usePma.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("useDma.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("useTest.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Test;
	}
	else if (stat("useDmaTest.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Test;
	}
	else if (stat("useDev.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Dev;
	}
	else if (stat("useDmaDev.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Dev;
	}
	else {
		this->environment = App_Env_Prod;
	}
}

string EnvConfig::getEnvPath()
{
	switch (this->environment)
	{
	case App_Env_Dev: {
		return "Dev";
	}
	case App_Env_Test: {
		return "Test";
	}
	case App_Env_Staging: {
		return "Staging";
	}
	case App_Env_Prod: {
		return "Prod";
	}
	default: {
		return "Staging";
	}
	}
}

string EnvConfig::getAppPath()
{

#if false
	char appPath[1024] = { 0 };
	getcwd(appPath, 1024);
	printf("getcwd =%s\r\n", appPath);
	if (MyStringUtils::startWith(appPath, "C:\\WINDOWS\\SysWOW64")) {
		memset(appPath, 0, 1024);

		if (DataCenter::getInstance()->factory.empty()) {
			sprintf(appPath, "%s", "C:\\Program Files (x86)\\Xtooltech\\JIDUDIAG_S");
		}
		else if (DataCenter::getInstance()->factory._Equal("DMA")) {
			sprintf(appPath, "%s", "C:\\Program Files (x86)\\Xtooltech\\JIDUDIAG_OTX");
		}
		else if (DataCenter::getInstance()->factory._Equal("PMA")) {
			sprintf(appPath, "%s", "C:\\Program Files (x86)\\Xtooltech\\JIDUDIAG_OTX");
		}
		else if (DataCenter::getInstance()->factory._Equal("AfterSale")) {
			sprintf(appPath, "%s", "C:\\Program Files (x86)\\Xtooltech\\JIDUDIAG_S");
		}
		else if (DataCenter::getInstance()->factory._Equal("Project")) {
			sprintf(appPath, "%s", "C:\\Program Files (x86)\\Xtooltech\\JIDUDIAG_E");
		}
	}
	return string(appPath);

#else
	return getWorkerFolderWindows();
#endif
}

bool EnvConfig::setEnvironment(int environment)
{
	this->environment = (App_Env_t)environment;
	return true;
}

int EnvConfig::getEnvironment()
{
	return this->environment;
}

bool EnvConfig::checkEnvironment()
{
	App_Env_t lastEnv = environment;
	struct stat sb;
	if (stat("useProd.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Prod;
	}
	else if (stat("useDmaProd.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Prod;
	}
	else if (stat("useStaging.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("usePma.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("useDma.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Staging;
	}
	else if (stat("useTest.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Test;
	}
	else if (stat("useDmaTest.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Test;
	}
	else if (stat("useDev.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Dev;
	}
	else if (stat("useDmaDev.txt", &sb) == 0 && (sb.st_mode & _S_IFMT)) {
		this->environment = App_Env_Dev;
	}
	else {
		this->environment = App_Env_Prod;
	}
	return environment == lastEnv;
}

void datou_otxProxy(void) {
	int a = 0;
	int b = 0;
	a = b;
}

string EnvConfig::getWorkerFolderWindows() {

	static string appPath;
	if (appPath.empty()) {
		char workerfolder[256] = { 0 };
		// the dll may install in folder anywhere
		// we can not use getcwd to fetch the real
		// location of this api dll.
		char* dllpath = (char*)malloc(256);
		HMODULE currentModule = NULL;
		BOOL state = GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)datou_otxProxy, &currentModule);
		if (!state) {
			free(dllpath);
			return ".//";
		}
		DWORD size = GetModuleFileName(currentModule, dllpath, 256);
		if (!size) {
			free(dllpath);
			return ".//";
		}
		char disk[3] = "";
		char mpath[256] = "";
		//_splitpath(dllpath, NULL, workerfolder, NULL, NULL);
		_splitpath(dllpath, disk, mpath, NULL, NULL);
		int diskLen = strlen(disk);
		memcpy(workerfolder, disk, diskLen);
		memcpy(workerfolder + diskLen, mpath, strlen(mpath));
		free(dllpath);

		appPath = string(workerfolder);
	}

	return appPath;
}