#include "extdll.h"
#include "basemenu.h"
#include "utils.h"
#include "ui_title_anim.h"

#define BANNER_X_FIX	-16
#define BANNER_Y_FIX	-20

// Title Transition Time period
#define TTT_PERIOD		200.0f

quad_t TitleLerpQuads[2];
int transition_initial_time;
int transition_state;
HIMAGE TransPic = 0;
int PreClickDepth;
bool hold_button_stack = false;

void UI_TACheckMenuDepth( void )
{
	PreClickDepth = uiStatic.menuDepth;
}

menuPicButton_s *ButtonStack[UI_MAX_MENUDEPTH];
int ButtonStackDepth;

void UI_PopPButtonStack()
{
	if( hold_button_stack ) return;

	if ( ButtonStack[ButtonStackDepth] ) UI_SetTitleAnim( AS_TO_BUTTON, ButtonStack[ButtonStackDepth] );
	if ( ButtonStackDepth ) ButtonStackDepth--;
}

void UI_PushPButtonStack( menuPicButton_s *button )
{
	if( ButtonStack[ButtonStackDepth] == button )
		return;

	ButtonStackDepth++;
	ButtonStack[ButtonStackDepth] = button;
}

float UI_GetTitleTransFraction( void )
{
	float fraction = (float)(uiStatic.realTime - transition_initial_time ) / TTT_PERIOD;

	if( fraction > 1.0f )
		fraction = 1.0f;

	return fraction;
}

void LerpQuad( quad_t a, quad_t b, float frac, quad_t *c )
{
	c->x = a.x + (b.x - a.x) * frac;
	c->y = a.y + (b.y - a.y) * frac;
	c->lx = a.lx + (b.lx - a.lx) * frac;
	c->ly = a.ly + (b.ly - a.ly) * frac;
}

void UI_SetupTitleQuad()
{
	TitleLerpQuads[1].x = UI_BANNER_POSX + BANNER_X_FIX;
	TitleLerpQuads[1].y = UI_BANNER_POSY + BANNER_Y_FIX;
	TitleLerpQuads[1].lx = UI_BANNER_WIDTH - 125;
	TitleLerpQuads[1].ly = UI_BANNER_HEIGHT - 40;
}

void UI_DrawTitleAnim()
{
	UI_SetupTitleQuad();

	if( !TransPic ) return;

	wrect_t r = { 0, uiStatic.buttons_width, 26, 51 };

	float frac = UI_GetTitleTransFraction();/*(sin(gpGlobals->time*4)+1)/2*/;

#ifdef TA_ALT_MODE
	if( frac == 1 && transition_state == AS_TO_BUTTON )
		return;
#else
	if( frac == 1 ) return;
#endif

	quad_t c;
	
	int f_idx = (transition_state == AS_TO_TITLE) ? 0 : 1;
	int s_idx = (transition_state == AS_TO_TITLE) ? 1 : 0;

	LerpQuad( TitleLerpQuads[f_idx], TitleLerpQuads[s_idx], frac, &c );

	PIC_Set( TransPic, 255, 255, 255, 255 );

	PIC_DrawAdditive( c.x, c.y, c.lx, c.ly, &r );
}

void UI_SetTitleAnim( int anim_state, menuPicButton_s *button )
{
	// skip buttons which don't call new menu
	if( !button || PreClickDepth == uiStatic.menuDepth && anim_state == AS_TO_TITLE )
		return;

	// replace cancel\done button with button which called this menu 
	if( PreClickDepth > uiStatic.menuDepth && anim_state == AS_TO_TITLE ) 
	{
		anim_state = AS_TO_BUTTON;

		// HACK HACK HACK
		if ( ButtonStack[ButtonStackDepth + 1] )
			button = ButtonStack[ButtonStackDepth+1];
	}	

	// don't reset anim if dialog buttons pressed
	if( button->generic.id == 130 || button->generic.id == 131 )
		return;

	if( anim_state == AS_TO_TITLE )
		UI_PushPButtonStack( button );

	transition_state = anim_state;

	TitleLerpQuads[0].x = button->generic.x;
	TitleLerpQuads[0].y = button->generic.y;
	TitleLerpQuads[0].lx = button->generic.width;
	TitleLerpQuads[0].ly = button->generic.height;
	
	transition_initial_time = uiStatic.realTime;
	TransPic = button->pic;
}

void UI_InitTitleAnim()
{
	memset( TitleLerpQuads, 0, sizeof( quad_t ) * 2 );

	UI_SetupTitleQuad();

	ButtonStackDepth = 0;
	memset( ButtonStack, 0, sizeof( ButtonStack ));
}

void UI_ClearButtonStack( void )
{
	ButtonStackDepth = 0;
	memset( ButtonStack, 0, sizeof( ButtonStack ));
}