/*
 * BuildVariants.cpp
 * -----------------
 * Purpose: Handling of various OpenMPT build variants.
 * Notes  : (currently none)
 * Authors: OpenMPT Devs
 * The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
 */

#include "stdafx.h"
#include "BuildVariants.h"
#include "../common/version.h"
#include "../misc/mptOS.h"
#include "../misc/mptCPU.h"
#include "Mptrack.h"


OPENMPT_NAMESPACE_BEGIN


bool BuildVariants::IsKnownSystem()
{
	return false
		|| mpt::OS::Windows::IsOriginal()
		|| (mpt::OS::Windows::IsWine() && theApp.GetWineVersion()->Version().IsValid())
		;
}


BuildVariants::Variants BuildVariants::GetBuildVariant()
{
#if defined(MPT_BUILD_RETRO)
	return Retro;
#else
#if defined(_WIN32_WINNT)
#if (_WIN32_WINNT >= 0x0A00) // Windows 10
	return Standard;
#else
	return Legacy;
#endif
#else
	return Unknown;
#endif
#endif
}


mpt::ustring BuildVariants::GetBuildVariantName(BuildVariants::Variants variant)
{
	mpt::ustring result;
	switch(variant)
	{
	case Standard:
		result = U_("Standard");
		break;
	case Legacy:
		result = U_("Legacy");
		break;
	case Retro:
		result = U_("Retro");
		break;
	case Unknown:
		result = U_("Unknown");
		break;
	}
	return result;
}


mpt::ustring BuildVariants::GetBuildVariantDescription(BuildVariants::Variants variant)
{
	mpt::ustring result;
	switch(variant)
	{
	case Standard:
		result = U_("");
		break;
	case Legacy:
		result = U_("");
		break;
	case Retro:
		result = U_(" RETRO");
		break;
	case Unknown:
		result = U_("");
		break;
	}
	return result;
}


mpt::ustring BuildVariants::GuessCurrentBuildName()
{
	if(GetBuildVariant() == Unknown)
	{
		return mpt::ustring();
	}
	if(mpt::arch_bits == 64)
	{
		if(GetBuildVariant() == Standard)
		{
			return U_("win64");
		} else
		{
			return U_("win64old");
		}
	} else if(mpt::arch_bits == 32)
	{
		if(GetBuildVariant() == Standard)
		{
			return U_("win32");
		} else
		{
			return U_("win32old");
		}
	} else
	{
		return mpt::ustring();
	}
}


bool BuildVariants::ProcessorCanRunCurrentBuild()
{
#ifdef MPT_ENABLE_ARCH_INTRINSICS
	if((CPU::Info::Get().AvailableFeatures & CPU::GetMinimumFeatures()) != CPU::GetMinimumFeatures())
	{
		return false;
	}
#endif // MPT_ENABLE_ARCH_INTRINSICS
	return true;
}


bool BuildVariants::SystemCanRunCurrentBuild() 
{
	if(mpt::OS::Windows::HostCanRun(mpt::OS::Windows::GetHostArchitecture(), mpt::OS::Windows::GetProcessArchitecture()) == mpt::OS::Windows::EmulationLevel::NA)
	{
		return false;
	}
#ifdef MPT_ENABLE_ARCH_INTRINSICS
	if((CPU::Info::Get().AvailableFeatures & CPU::GetMinimumFeatures()) != CPU::GetMinimumFeatures())
	{
		return false;
	}
#endif // MPT_ENABLE_ARCH_INTRINSICS
	if(IsKnownSystem())
	{
		if(mpt::OS::Windows::IsOriginal())
		{
			if(mpt::OS::Windows::Version::Current().IsBefore(mpt::OS::Windows::Version::GetMinimumKernelLevel()))
			{
				return false;
			}
			if(mpt::OS::Windows::Version::Current().IsBefore(mpt::OS::Windows::Version::GetMinimumAPILevel()))
			{
				return false;
			}
		} else if(mpt::OS::Windows::IsWine())
		{
			if(theApp.GetWineVersion()->Version().IsBefore(mpt::OS::Wine::GetMinimumWineVersion()))
			{
				return false;
			}
		}
	}
	return true;
}


OPENMPT_NAMESPACE_END