#include "cCamera.hpp"

/*** Custom Header Files ***/
#include "cRenderer.hpp"
#include "../UtilityEngine/cUtility.hpp"

using VideoEngine::cCamera;
using UtilityEngine::cUtility;

cCamera::cCamera( const signed long int xPos /*= 0*/, const signed long int yPos /*= 0*/, 
				 const unsigned long int reswidth /*= 640*/, const unsigned long int reshight /*= 480*/ )
: mp_texture(nullptr)
{
	m_position.x = Sint16(xPos);
	m_position.y = Sint16(yPos);

	m_position.w = Uint16(reswidth);
	m_position.h = Uint16(reshight);

	CreateCamera();
}

cCamera::cCamera( const cCamera& copy )
{
	m_position.x = Sint16(copy.getXPos());
	m_position.y = Sint16(copy.getYPos());

	m_position.w = Uint16(copy.getWidthRes());
	m_position.h = Uint16(copy.getHeightRes());

	setTexture(copy.getTexture());
}

cCamera::~cCamera()
{
	DeleteCamera();
}

void cCamera::Draw()
{
	cRenderer::Inst().Render(mp_texture, nullptr, &m_position);
}

void cCamera::SaveImage( const cString& fileName, const cString& dir /*= ""*/ )
{
	cRenderer::Inst().SaveTexture(mp_texture, fileName, dir);
}

///Sets
void cCamera::setXPosandYPos( const signed long int xPos /*= 0*/, const signed long int yPos /*= 0*/ )
{
	m_position.x = Sint16(xPos);
	m_position.y = Sint16(yPos);

	CreateCamera();
}

void cCamera::setResWidthandResHeight( const unsigned long int reswidth /*= 640*/, const unsigned long int reshight /*= 480*/ )
{
	m_position.w = Uint16(reswidth);
	m_position.h = Uint16(reshight);

	CreateCamera();
}

void cCamera::setTexture( SDL_Texture* texture )
{
	DeleteCamera();
	CreateCamera();

	cRenderer::Inst().CopyTexture(texture, mp_texture);
}

///Gets
const unsigned long int cCamera::getXPos() const
{
	return m_position.x;
}

const unsigned long int cCamera::getYPos() const
{
	return m_position.y;
}

const unsigned long int cCamera::getWidthRes() const
{
	return m_position.w;
}

const unsigned long int cCamera::getHeightRes() const
{
	return m_position.h;
}

SDL_Texture* cCamera::getCameraView() const
{
	return mp_texture;
}

SDL_Texture* cCamera::getTexture() const
{
	return mp_texture;
}

void cCamera::CreateCamera()
{
	DeleteCamera();
	mp_texture = cRenderer::Inst().NewTexture(m_position.w, m_position.h, SDL_TEXTUREACCESS_TARGET);

	if (mp_texture == nullptr)
		cUtility::Inst().Message("Unable to create camera.", __AT__);
}

void cCamera::DeleteCamera()
{
	if (mp_texture != nullptr)
		SDL_DestroyTexture(mp_texture);
}