#include ".\weathermanager.h"

WeatherManager::WeatherManager(void)
{
	weatherType = WEATHER_TYPE::CLOUDS;
	currentX = -256;
	currentY = -256;
	cloudDX = 1;
	cloudDY = 2;
	cloudTickCount = 0;
}

WeatherManager::~WeatherManager(void)
{

}

void WeatherManager::init( SpriteRenderer* _spriteRenderer, ScreenManager* _screenManager ) {
	spriteRenderer = _spriteRenderer;
	screenManager = _screenManager;

    lastScreenX = screenManager->getScreenX();
    lastScreenY = screenManager->getScreenY();
}

void WeatherManager::setWeather( WEATHER_TYPE _weatherType ) {
	weatherType = _weatherType;
}

HRESULT WeatherManager::render() {
	HRESULT r;

	// Get which thing to render
	int textureId;
	switch( weatherType ) {
		case WEATHER_TYPE::CLOUDS:
			textureId = CLOUD_TEXTURE_ID;
			break;
		case NONE:
			textureId = -1;
			break;
		default:
			textureId = -1;
			GameError( "Error rendering weather.  No biggie" );
			break;
	}

	// render it over the entire screen
	if ( textureId != -1 ) {
		// Get the new screen position to tell if we've moved
		int currentScreenX = screenManager->getScreenX();
		int currentScreenY = screenManager->getScreenY();

        int diffX = lastScreenX - currentScreenX;
        int diffY = lastScreenY - currentScreenY;

		// Update according to the world to produce a paralax effect
		currentX += diffX;
		currentY += diffY;

        if ( diffX != 0 ) {
            currentX += diffX;
        }
        if ( diffY != 0 ) {
            currentY += diffY;
        }

		// Optimize to not render as much
		while( currentX < -WEATHER_WIDTH ) {
			currentX += WEATHER_WIDTH;
		}
		while( currentX > 0 ) {
			currentX -= WEATHER_WIDTH;
		}
		while( currentY < -WEATHER_HEIGHT ) {
			currentY += WEATHER_HEIGHT;
		}
		while( currentY > 0 ) {
			currentY -= WEATHER_HEIGHT;
		}

		// Render over the entire screen
		for ( int x = currentX; x < screenManager->getWindowWidth(); x += WEATHER_WIDTH ) {
			for ( int y = currentY; y < screenManager->getWindowHeight(); y += WEATHER_HEIGHT ) {
				r = spriteRenderer->renderToScreen( textureId, x, y );
				if ( FAILED( r ) ) {
					GameError( "Error rendering weather" );
					return r;
				}
			}
		}

		// Save our variables for next time
		lastScreenX = currentScreenX;
		lastScreenY = currentScreenY;
	}

	return S_OK;
}

void WeatherManager::tick() {
    cloudTickCount++;

	// update position of weather
	switch( weatherType ) {
		case WEATHER_TYPE::CLOUDS:
			// Update clouds based on movement relative to themselves
			if ( cloudTickCount > CLOUD_CHANGE_TICKS ) {
			    currentX += cloudDX;
			    currentY += cloudDY;
                cloudTickCount = 0;
			}
			break;
		case NONE:
			break;
		default:
			GameError( "Error updating weather.  Wrong type." );
			break;
	}
}
