#include "stdafx.h"
#include "title.h"
#include "rpcs3_version.h"

#include "util/sysinfo.hpp"

namespace rpcs3
{
	std::string get_formatted_title(const title_format_data& title_data)
	{
		// Parse title format string
		std::string title_string;

		for (usz i = 0; i < title_data.format.size();)
		{
			const char c1 = title_data.format[i];

			if (c1 == '\0')
			{
				break;
			}

			switch (c1)
			{
			case '%':
			{
				const char c2 = title_data.format[i + 1];

				if (c2 == '\0')
				{
					title_string += '%';
					i++;
					continue;
				}

				switch (c2)
				{
				case '%':
				{
					title_string += '%';
					break;
				}
				case 'T':
				{
					title_string += title_data.title;
					break;
				}
				case 't':
				{
					title_string += title_data.title_id;
					break;
				}
				case 'R':
				{
					fmt::append(title_string, "%s", title_data.renderer);
					break;
				}
				case 'V':
				{
					static const std::string version = rpcs3::get_version_and_branch();
					title_string += version;
					break;
				}
				case 'F':
				{
					fmt::append(title_string, "%.2f", title_data.fps);
					break;
				}
				case 'G':
				{
					title_string += title_data.vulkan_adapter;
					break;
				}
				case 'C':
				{
					static const std::string brand = utils::get_cpu_brand();
					title_string += brand;
					break;
				}
				case 'c':
				{
					fmt::append(title_string, "%d", utils::get_thread_count());
					break;
				}
				case 'M':
				{
					fmt::append(title_string, "%.2f", utils::get_total_memory() / (1024.0f * 1024 * 1024));
					break;
				}
				default:
				{
					title_string += '%';
					title_string += c2;
					break;
				}
				}

				i += 2;
				break;
			}
			default:
			{
				title_string += c1;
				i += 1;
				break;
			}
			}
		}

		return title_string;
	}
} // namespace rpcs3
