#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <gui/color.h>
#include <gui/widget/msgbox.h>

#include <driver/fontrenderer.h>
#include <driver/rcinput.h>
#include <system/settings.h>

#include <global.h>
#include <neutrino.h>
#include <gui/pipsetup.h>
#include <video.h>

#define PERCENT 5
#define XMOVE 10
#define YMOVE 10

#ifdef ENABLE_PIP

extern cVideo *pipDecoder;

CPipSetup::CPipSetup()
{
	frameBuffer = CFrameBuffer::getInstance();

	if(CNeutrinoApp::getInstance()->getMode() == NeutrinoMessages::mode_radio) {
		gx = &g_settings.pip_radio_x;
		gy = &g_settings.pip_radio_y;
		gw = &g_settings.pip_radio_width;
		gh = &g_settings.pip_radio_height;
	} else {
		gx = &g_settings.pip_x;
		gy = &g_settings.pip_y;
		gw = &g_settings.pip_width;
		gh = &g_settings.pip_height;
	}
	x_coord = *gx;
	y_coord = *gy;
	width = *gw;
	height = *gh;

	maxw = frameBuffer->getScreenWidth(true);
	maxh = frameBuffer->getScreenHeight(true);
	minw = maxw/8;
	minh = minw*1000/1825;
}

void CPipSetup::move(int x, int y, bool abs)
{
	int newx, newy;

	if(abs) {
		newx = x;
		newy = y;
	} else {
		newx = x_coord + x;
		newy = y_coord + y;
		if(newx < 0) newx = 0;
		else if((newx + width) >= maxw) newx = maxw - width;
		if(newy < 0) newy = 0;
		else if((newy + height) >= maxh) newy = maxh - height;
	}
	x_coord = newx;
	y_coord = newy;
	*gx = x_coord;
	*gy = y_coord;

	printf("CPipSetup::move: x %d y %d\n", x_coord, y_coord);
	pipDecoder->Pig(x_coord, y_coord, width, height, maxw, maxh);
}

// w and h is percent, if not absolute
void CPipSetup::resize(int w, int h, bool abs)
{
	int neww, newh;

	if(abs) {
		width = w;
		height = h;
	} else {
		neww = width + (maxw*w/100);
		//newh = neww * 100 / 125;
		newh = height + (maxh*h/100);

		if(neww > maxw) neww = maxw;
		else if(neww < minw) neww = minw;

		if(newh > maxh) newh = maxh;
		else if(newh < minh) newh = minh;
		if( (x_coord + neww) > maxw)
			return;
		if( (y_coord + newh) > maxh)
			return;
		width = neww;
		height = newh;
	}
	*gw = width;
	*gh = height;

	printf("CPipSetup::resize: w %d h %d \n", width, height);
	pipDecoder->Pig(x_coord, y_coord, width, height, maxw, maxh);
}

int CPipSetup::exec(CMenuTarget* parent, const std::string &)
{
	neutrino_msg_t      msg;
	neutrino_msg_data_t data;
	int oldx = x_coord;
	int oldy = y_coord;
	int oldw = width;
	int oldh = height;

	printf("CPipSetup::exec\n");
	int res = menu_return::RETURN_REPAINT;

	if (parent)
		parent->hide();

	paint();

	uint64_t timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings::TIMING_MENU]);

	bool loop=true;
	while (loop) {
		g_RCInput->getMsgAbsoluteTimeout(&msg, &data, &timeoutEnd, true);

		if ( msg <= CRCInput::RC_MaxRC )
			timeoutEnd = CRCInput::calcTimeoutEnd(g_settings.timing[SNeutrinoSettings::TIMING_MENU] == 0 ? 0xFFFF : g_settings.timing[SNeutrinoSettings::TIMING_MENU]);

		if ((msg == (neutrino_msg_t) g_settings.key_pip_setup) ||
			(msg == CRCInput::RC_timeout) || (msg == CRCInput::RC_ok)) {
				loop = false;
				break;
		} else if ((msg == CRCInput::RC_home) || (msg == CRCInput::RC_spkr)) {
			clear();
			move(oldx, oldy, true);
			resize(oldw, oldh, true);
			paint();
			if (msg == CRCInput::RC_home)
				loop = false;
		} else if ((msg == CRCInput::RC_up) || (msg == CRCInput::RC_down)) {
			clear();
			move(0, (msg == CRCInput::RC_up) ? -YMOVE : YMOVE);
			paint();
		} else if ((msg == CRCInput::RC_left) || (msg == CRCInput::RC_right)) {
			clear();
			move((msg == CRCInput::RC_left) ? -XMOVE : XMOVE, 0);
			paint();
		} else if ((msg == CRCInput::RC_plus) || (msg == CRCInput::RC_minus)) {
			clear();
			int percent = (msg == CRCInput::RC_plus) ? PERCENT : -PERCENT;
			resize(percent, percent);
			paint();
		} else if (msg >  CRCInput::RC_MaxRC) {
			if ( CNeutrinoApp::getInstance()->handleMsg( msg, data ) & messages_return::cancel_all ) {
				loop = false;
				res = menu_return::RETURN_EXIT_ALL;
			}
		}
	}
	hide();
	return res;
}

void CPipSetup::hide()
{
	frameBuffer->Clear();
}

void CPipSetup::clear()
{
	frameBuffer->paintBackgroundBoxRel(x_coord, y_coord, width, height);
}

void CPipSetup::paint()
{
	if (!frameBuffer->getActive())
		return;

	char xpos[30];
	char ypos[30];
	char wpos[30];
	char hpos[30];

	sprintf(xpos, "X: %d", x_coord );
	sprintf(ypos, "Y: %d", y_coord );
	sprintf(wpos, "W: %d", width );
	sprintf(hpos, "H: %d", height );

	int mheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight();
	int mwidth = 10 + g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth("W: 9999");
	int x = (frameBuffer->getScreenWidth() - mwidth)/2;
	int y = (frameBuffer->getScreenHeight() - mheight*4)/2;

	if (pipDecoder->getBlank())
		frameBuffer->paintBoxRel(x_coord, y_coord, width, height, COL_MENUCONTENT_PLUS_0);

	frameBuffer->paintBoxRel(x, y, mwidth, mheight*4, COL_MENUCONTENT_PLUS_0);

	g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight,   mwidth, xpos, COL_MENUCONTENT_TEXT);
	g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*2, mwidth, ypos, COL_MENUCONTENT_TEXT);
	g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*3, mwidth, wpos, COL_MENUCONTENT_TEXT);
	g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(x+5, y+mheight*4, mwidth, hpos, COL_MENUCONTENT_TEXT);
}

#endif //#ifdef ENABLE_PIP
