#include "MyUtil.h"
#include <vector>
#include <string>
#include <sstream>
CString GetFileNameWithoutExtension(const CString& filePath)
{
	// 查找最后一个路径分隔符（'\' 或 '/'）
	int lastSlash = filePath.ReverseFind('\\');
	int lastFslash = filePath.ReverseFind('/');
	int lastSeparator = max(lastSlash, lastFslash);

	// 查找最后一个点号（文件扩展名分隔符）
	int lastDot = filePath.ReverseFind('.');

	// 确定文件名部分的起始位置
	int fileNameStart = (lastSeparator >= 0) ? lastSeparator + 1 : 0;

	// 确定文件名部分的结束位置
	int fileNameEnd = (lastDot > fileNameStart) ? lastDot : filePath.GetLength();

	// 提取文件名部分
	return filePath.Mid(fileNameStart, fileNameEnd - fileNameStart);
}

CString GetFileDirectory(const CString& fullPath)
{
	// 查找最后一个路径分隔符（支持 '\' 和 '/'）
	int lastBackslash = fullPath.ReverseFind('\\');
	int lastForwardslash = fullPath.ReverseFind('/');
	int lastSeparator = max(lastBackslash, lastForwardslash);

	// 如果找到路径分隔符，返回分隔符之前的部分（即路径）
	if (lastSeparator >= 0)
	{
		return fullPath.Left(lastSeparator);
	}

	// 如果没有找到路径分隔符，返回空字符串（表示当前目录）
	return _T("");
}

CString ChangeFileExtension(const CString& fullPath, const CString& newExtension)
{
	int lastSlash = fullPath.ReverseFind('\\');
	int lastFslash = fullPath.ReverseFind('/');
	int lastSeparator = max(lastSlash, lastFslash);
	int lastDot = fullPath.ReverseFind('.');

	// 确保 newExtension 以 '.' 开头
	CString ext = newExtension;
	if (ext.GetLength() > 0 && ext[0] != '.')
	{
		ext = _T(".") + ext;
	}

	if (lastDot > lastSeparator)
	{
		return fullPath.Left(lastDot) + ext;
	}
	else
	{
		return fullPath + ext;
	}
}

CString ReplaceFileNameKeepPathAndExtension(const CString& originalFullPath, const CString& newFileName)
{
	// 1. 查找最后一个路径分隔符（'\' 或 '/'）
	int lastBackslash = originalFullPath.ReverseFind('\\');
	int lastForwardslash = originalFullPath.ReverseFind('/');
	int lastSeparator = max(lastBackslash, lastForwardslash);

	// 2. 查找最后一个点号（文件扩展名分隔符）
	int lastDot = originalFullPath.ReverseFind('.');

	// 3. 提取原路径和扩展名
	CString originalPath = (lastSeparator >= 0) ? originalFullPath.Left(lastSeparator + 1).GetString() : L"";
	CString originalExtension = (lastDot > lastSeparator) ? originalFullPath.Mid(lastDot).GetString() : L"";

	// 4. 组合新文件名（路径 + 新文件名 + 原扩展名）
	return originalPath + newFileName + originalExtension;
}

CString TruncateFilePath(const CString& fullPath, const CString& basePath)
{
	// 1. 统一路径分隔符为反斜杠（确保比较一致性）
	CString normalizedFull = fullPath;
	normalizedFull.Replace(_T("/"), _T("\\"));

	CString normalizedBase = basePath;
	normalizedBase.Replace(_T("/"), _T("\\"));

	// 2. 确保basePath以反斜杠结尾（便于比较）
	if (!normalizedBase.IsEmpty() && normalizedBase.GetAt(normalizedBase.GetLength() - 1) != _T('\\')) {
		normalizedBase += _T("\\");
	}

	// 3. 查找basePath在fullPath中的位置
	int pos = normalizedFull.Find(normalizedBase);
	if (pos == 0) { // 如果匹配到开头
		CString relativePart = normalizedFull.Mid(normalizedBase.GetLength());

		// 4. 去掉文件扩展名
		int dotPos = relativePart.ReverseFind(_T('.'));
		if (dotPos > 0) {
			relativePart = relativePart.Left(dotPos);
		}

		// 5. 去掉开头的反斜杠（如果存在）
		if (!relativePart.IsEmpty() && relativePart.GetAt(0) == _T('\\')) {
			relativePart = relativePart.Mid(1);
		}

		return relativePart;
	}

	// 如果不匹配，返回原始路径（去掉扩展名）
	int dotPos = normalizedFull.ReverseFind(_T('.'));
	if (dotPos > 0) {
		return normalizedFull.Left(dotPos).Mid(normalizedFull.ReverseFind(_T('\\')) + 1);
	}
	return normalizedFull.Mid(normalizedFull.ReverseFind(_T('\\')) + 1);
}

CString GetRelativePathWithPrefix(const CString& fullPath, const CString& basePath)
{
	// 1. 统一路径分隔符为反斜杠
	CString normalizedFull = fullPath;
	normalizedFull.Replace(_T("/"), _T("\\"));

	CString normalizedBase = basePath;
	normalizedBase.Replace(_T("/"), _T("\\"));

	// 2. 确保basePath以反斜杠结尾
	if (!normalizedBase.IsEmpty() && normalizedBase.GetAt(normalizedBase.GetLength() - 1) != _T('\\')) {
		normalizedBase += _T("\\");
	}

	// 3. 查找basePath在fullPath中的位置
	int pos = normalizedFull.Find(normalizedBase);
	if (pos == 0) { // 如果匹配到开头
		CString relativePart = normalizedFull.Mid(normalizedBase.GetLength());

		// 4. 添加".\"前缀
		if (!relativePart.IsEmpty()) {
			// 保留原有的相对路径前缀（如".\"或"..\"）
			if (relativePart.Find(_T(".\\")) == 0 || relativePart.Find(_T("..\\")) == 0) {
				// 已经包含前缀，不做处理
			}
			else {
				relativePart = _T(".\\") + relativePart;
			}
		}

		return relativePart;
	}

	// 5. 如果不匹配，返回带".\"前缀的文件名
	int lastBackslash = normalizedFull.ReverseFind(_T('\\'));
	if (lastBackslash >= 0) {
		return _T(".\\") + normalizedFull.Mid(lastBackslash + 1);
	}
	return _T(".\\") + normalizedFull;
}

std::wstring JoinWithSemicolon(const std::vector<std::wstring>& vec)
{
	std::wstringstream ss;
	for (size_t i = 0; i < vec.size(); ++i) 
	{
		if (i != 0) {
			ss << L";";
		}
		ss << vec[i];
	}
	return ss.str();
}

std::vector<std::wstring> SplitBySemicolon(const std::wstring& str)
{
	std::vector<std::wstring> result;
	std::wstringstream ss(str);
	std::wstring item;
	while (std::getline(ss, item, L';')) 
	{
		if (!item.empty()) 
			result.push_back(item);
	}
	return result;
}
