///////////////////////////////////////////////////////////////////////////////
//  LFileName.cpp

#include "LFileName.h"
#include "../../Independent/CharacterCode/IsCode.h"

std::string LFileName::GetExtension(const std::string& szName)
{
	int i;
	
	// 最後の【 . 】を探す
	const int nLength = (int)szName.length();

	int nPos = -1;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
		}
		else {
			if (szName[i] == '.') nPos = i;

			i++;
		}
	}

	// 【 . 】の次の文字以降を取得する
	if (nPos != -1) {
		// 小文字化して返す
		return LFileName::ToLower(szName.substr(nPos + 1, szName.length()));
	}
	else {
		return std::string();
	}
	
}

std::string LFileName::AddPunct(const std::string& szName)
{
	int i;

	// 最後の【 \ 】または【 / 】を探す
	const int nLength = (int)szName.length();

	bool bExist = false;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
			bExist = false;
		}
		else {
			if (szName[i] == '\\' || szName[i] == '/') bExist = true;
			else bExist = false;

			i++;
		}
	}

	if (!bExist) {
#ifdef WIN32        
		return szName + '\\';
#else
		return szName + '/';
#endif
	}
	else {
		return szName;
	}

}

std::string LFileName::DeleteFileName(const std::string& szName)
{
	int i;

	// 最後の【 \ 】または【 / 】を探す
	const int nLength = (int)szName.length();

	int nPos = -1;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
		}
		else {
			if (szName[i] == '\\' || szName[i] == '/') nPos = i;

			i++;
		}
	}

	// ファイル名を削除する
	if (nPos == -1) {
		return std::string();
	}
	else {
		return szName.substr(0, nPos + 1);
	}

}

std::string LFileName::DeleteExtension(const std::string& szName)
{
	int i;

	// 最後の【 . 】を探す
	const int nLength = (int)szName.length();

	int nPos = -1;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
		}
		else {
			if (szName[i] == '.') nPos = i;

			i++;
		}
	}

	// 【 . 】以降削除
	if (nPos == -1) {
		return szName;
	}
	else {
		return szName.substr(0, nPos);
	}

}

std::string LFileName::DeleteFirstDir(const std::string& szName)
{
	int i;
	
	const int nLength = (int)szName.length();

	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) i += 2;
		else {
			if (szName[i] == '\\' || szName[i] == '/') break;
			i++;
		}
	}

	if (i < (int)szName.length()) {
		return szName.substr(i + 1, szName.length());
	}

	return szName;

}

std::string LFileName::DeleteDir(const std::string& szName)
{
	int i;

	// 最後の【 \ 】または【 / 】を探す
	const int nLength = (int)szName.length();

	int nPos = -1;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
		}
		else {
			if (szName[i] == '\\' || szName[i] == '/') nPos = i;

			i++;
		}
	}

	// ディレクトリ部分を削除する
	if (nPos == -1) {
		return szName;
	}
	else {
		return szName.substr(nPos + 1, szName.length());
	}

}

std::string LFileName::GetFirstDir(const std::string& szName)
{
	int i;

	const int nLength = (int)szName.length();

	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) i += 2;
		else {
			if (szName[i] == '\\' || szName[i] == '/') break;
			i++;
		}
	}

	if (i < (int)szName.length()) {
		return szName.substr(0, i);
	}
	else {
		return std::string();
	}

}

std::string LFileName::ToLower(const std::string& szName)
{
	int i;

	std::string szResult;

	const int nLength = (int)szName.length();

	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			szResult += szName[i++];
			szResult += szName[i++];
		}
		else if (szName[i] >= 'A' && szName[i] <= 'Z') {
			szResult += szName[i++] + 0x20;
		}
		else {
			szResult += szName[i++];
		}
	}

	return szResult;

}

std::string LFileName::DeletePunct(const std::string& szName)
{
	int i;

	// 最後の【 \ 】を探す
	const int nLength = (int)szName.length();

	bool bExist = false;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
			bExist = false;
		}
		else {
			if (szName[i] == '\\' || szName[i] == '/') bExist = true;
			else bExist = false;

			i++;
		}
	}

	if (bExist) {
		return szName.substr(0, szName.length() - 1);
	}

	return szName;
}

std::string LFileName::ChangeExtension(const std::string& szName, const std::string& szExt)
{
	return LFileName::DeleteExtension(szName) += "." + szExt;
}

std::string LFileName::DeleteExceptFileName(const std::string& szName)
{
	int i;

	// 最後の【 \ 】または【 / 】を探す
	const int nLength = (int)szName.length();

	int nPos = -1;
	for (i = 0; i < nLength; ) {
		if (IsKanji(szName[i])) {
			i += 2;
		}
		else {
			if (szName[i] == '\\' || szName[i] == '/') nPos = i;

			i++;
		}
	}

	// ファイル名を削除する
	if (nPos != -1) {
		return szName.substr(0, nPos);
	}
	else {
		return std::string();
	}
}

std::string LFileName::GetParent(const std::string& FileName)
{
	return LFileName::DeletePunct(LFileName::DeleteFileName(FileName));

}

