#pragma once

#include "../Core.h"
#include "../CardManager.h"
#include "../CPU.h"
#include "../DiskImage.h"	// Disk_Status_e
#include "../Harddisk.h"
#include "../Interface.h"	// VideoRefreshRate_e, GetVideoRefreshRate()
#include "../Tfe/tfe.h"

class CConfigNeedingRestart
{
public:
	CConfigNeedingRestart(UINT bEnableTheFreezesF8Rom = false) :
		m_Apple2Type( GetApple2Type() ),
		m_CpuType( GetMainCpu() ),
		m_uSaveLoadStateMsg(0),
		m_videoRefreshRate( GetVideo().GetVideoRefreshRate() )
	{
		m_bEnableTheFreezesF8Rom = bEnableTheFreezesF8Rom;

		for (UINT slot = SLOT0; slot < NUM_SLOTS; slot++)
			m_Slot[slot] = GetCardMgr().QuerySlot(slot);
		m_SlotAux = GetCardMgr().QueryAux();

		m_tfeInterface = get_tfe_interface();
	}

	const CConfigNeedingRestart& operator= (const CConfigNeedingRestart& other)
	{
		m_Apple2Type = other.m_Apple2Type;
		m_CpuType = other.m_CpuType;
		memcpy(m_Slot, other.m_Slot, sizeof(m_Slot));
		m_SlotAux = other.m_SlotAux;
		m_tfeInterface = other.m_tfeInterface;
		m_bEnableTheFreezesF8Rom = other.m_bEnableTheFreezesF8Rom;
		m_uSaveLoadStateMsg = other.m_uSaveLoadStateMsg;
		m_videoRefreshRate = other.m_videoRefreshRate;
		return *this;
	}

	bool operator== (const CConfigNeedingRestart& other) const
	{
		return	m_Apple2Type == other.m_Apple2Type &&
			m_CpuType == other.m_CpuType &&
			memcmp(m_Slot, other.m_Slot, sizeof(m_Slot)) == 0 &&
			m_SlotAux == other.m_SlotAux &&
			m_tfeInterface == other.m_tfeInterface &&
			m_bEnableTheFreezesF8Rom == other.m_bEnableTheFreezesF8Rom &&
			m_uSaveLoadStateMsg == other.m_uSaveLoadStateMsg &&
			m_videoRefreshRate == other.m_videoRefreshRate;
	}

	bool operator!= (const CConfigNeedingRestart& other) const
	{
		return !operator==(other);
	}

	eApple2Type	m_Apple2Type;
	eCpuType m_CpuType;
	SS_CARDTYPE m_Slot[NUM_SLOTS];
	SS_CARDTYPE m_SlotAux;
	std::string m_tfeInterface;
	UINT m_bEnableTheFreezesF8Rom;
	UINT m_uSaveLoadStateMsg;
	VideoRefreshRate_e m_videoRefreshRate;
};