#include "pch.h"

#include "StringUtil.h"
#include <clocale>

// для работы с std::wstring нет многих стандартных нужных функций.

std::wstring trim(const std::wstring &str, const wchar_t trim_char)
{
	std::wstring res = trimLeft(str, trim_char);
	return trimRight(res, trim_char);
}

std::wstring trimLeft(const std::wstring &str, const wchar_t trim_char)
{
	std::wstring res = str;

	while (!res.empty() && (res.front() == trim_char))
	{
		res.erase(res.begin());
	}

	return res;
}

std::wstring trimRight(const std::wstring &str, const wchar_t trim_char)
{
	std::wstring res = str;

	while (!res.empty() && (res.back() == trim_char))
	{
		res.pop_back();
	}

	return res;
}

std::wstring  replaceChar(const std::wstring &str, const wchar_t src, const wchar_t dst)
{
	if (!str.empty())
	{
		std::wstring res;

		for (auto wch : str)
		{
			if (wch == src)
			{
				wch = dst;
			}

			res.push_back(wch);
		}

		return res;
	}

	return str;
}

std::wstring strToUpper(const std::wstring &str)
{
	std::wstring res;

	if (!str.empty())
	{
		_locale_t loc = _create_locale(LC_ALL, "Russian");

		for (auto n : str)
		{
			res.push_back(_toupper_l(n, loc));
		}

		_free_locale(loc);
	}

	return res;
}

std::wstring strToLower(const std::wstring &str)
{
	std::wstring res;

	if (!str.empty())
	{
		_locale_t loc = _create_locale(LC_ALL, "Russian");

		for (auto n : str)
		{
			res.push_back(_tolower_l(n, loc));
		}

		_free_locale(loc);
	}

	return res;
}


std::wstring replaceChars(const std::wstring &str, const std::wstring &src, const wchar_t dst)
{
	if (!str.empty() && !src.empty())
	{
		std::wstring res;

		for (auto wch : str)
		{
			for (auto s : src)
			{
				if (wch == s)
				{
					wch = dst;
					break;
				}
			}

			res.push_back(wch);
		}

		return res;
	}

	return str;
}

// сокращение строки до заданной длины.
// Вход: str - строка
// len - желаемая длина
// Выход: сформированная строка
std::wstring CropStr(const std::wstring &str, const size_t len)
{
	std::wstring res = trim(str);

	if (res.length() >= len)
	{
		std::wstring crop = res.substr(0, len - 1);
		crop += res.back();
		return crop;
	}

	return res;
}
