#include ".\tintmanager.h"

TintManager::TintManager(void)
{
	red = 256;
	green = 256;
	blue = 0;
	alpha = 25;
	alpha_max = 75;
	alpha_min = 25;
	time = DAY_1;
	step = 8;
}

TintManager::~TintManager(void)
{
}

void TintManager::init( SpriteRenderer* newSpriteRenderer ) {
	spriteRenderer = newSpriteRenderer;
}

void TintManager::loadTint( int newTextureId ) {
	textureId = newTextureId;
}

HRESULT TintManager::tick() {
	HRESULT r = S_OK;

	switch( time ) {
        case DAY_1:
            blue += step;
			if( blue == 256 ) {
				time = DAY_2;
			}
            break;
		case DAY_2:
			green -= (step/2);
			blue -= (step/2);
			if( green == 128 ) {
				time = DAY_3;
			}
            break;
		case DAY_3:
            blue -= (step/2);
			if( blue == 0 ) {
				time = EVENING_1;
			}
            break;
		case EVENING_1:
            green -= (step/2);
			if( alpha < alpha_max ) {
				alpha++;
			}
			if( green == 0 ) {
				time = EVENING_2;
			}
            break;
		case EVENING_2:
			red -= (step/2);
            blue += (step/2);
			if( alpha < alpha_max ) {
				alpha++;
			}
			if( red == 128 ) {
				time = NIGHT_1;
			}
            break;
		case NIGHT_1:
            red -= (step/2);
			if( red == 0 ) {
				time = NIGHT_2;
			}
            break;
		case NIGHT_2:
            blue += (step/2);
			if( blue == 256 ) {
				time = MORNING_1;
			}
            break;
		case MORNING_1:
            green += (step/2);
			if( alpha > alpha_min ) {
				alpha--;
			}
			if( green == 128 ) {
				time = MORNING_2;
			}
            break;
		case MORNING_2:
            red += step;
			green += (step/2);
			blue -= step;
			if( alpha > alpha_min ) {
				alpha--;
			}
			if( red == 256 ) {
				time = DAY_1;
			}
            break;
        

    }
	
	return r;
}

HRESULT TintManager::render() {
	// Render the sprite
	int r = red;
	int g = green;
	int b = blue;
	if( r == 256 ) {
		r--;
	}
	if( g == 256 ) {
		g--;
	}
	if( b == 256 ) {
		b--;
	}
	HRESULT result = spriteRenderer->renderTint( textureId, r, g, b, alpha );
	if ( FAILED( r ) ) {
		GameError( "Could not render tint." );
		return result;
	}

	// Render sun or moon
	switch( time ) {
        case DAY_1:
		case DAY_2:
		case DAY_3:
			spriteRenderer->renderToScreen( 600, 950, 10 );
            break;
		case EVENING_1:
		case EVENING_2:
			spriteRenderer->renderToScreen( 601, 950, 10 );
            break;
		case NIGHT_1:
		case NIGHT_2:
			spriteRenderer->renderToScreen( 602, 950, 10 );
            break;
		case MORNING_1:
		case MORNING_2:
            spriteRenderer->renderToScreen( 603, 950, 10 );
            break;
        

    }

	return S_OK;
}

TintManager::TIME TintManager::getTime() {
	return time;
}
