#ifndef NAVIGATION_DIALOG_H
#define NAVIGATION_DIALOG_H

#include <QtGui>
#include "ui_navigationDialog.h"
#include "softProj\clientServer\structs.h"
#include "softProj\settings.h"
#include <cassert>

class NavigationDialog : public QDialog
{
    Q_OBJECT
private:
	Ui::NavigationDialog ui_;
	bool canDockDown_;
signals:
	void moveStandardSignal();
	void moveSubspaceSignal();
	void cancelSignal();
	void dockDownSignal();
private slots:
	void standardButtonClickedSlot(bool checked) {
		emit moveStandardSignal();
	}

	void subspaceButtonClickedSlot(bool checked) {
		emit moveSubspaceSignal();
	}

	void dockButtonClickedSlot(bool checked) {
		emit dockDownSignal();
	}

	void cancelButtonClickedSlot(bool checked) {
		emit cancelSignal();
	}
public:
	NavigationDialog(QWidget * parent) : QDialog(parent) {
		ui_.setupUi(this);

		bool ok = true;
		ok = ok && QObject::connect(ui_.standardButton, SIGNAL(clicked(bool)), this, SLOT(standardButtonClickedSlot(bool)));
		ok = ok && QObject::connect(ui_.subspaceButton, SIGNAL(clicked(bool)), this, SLOT(subspaceButtonClickedSlot(bool)));
		ok = ok && QObject::connect(ui_.dockButton, SIGNAL(clicked(bool)), this, SLOT(dockButtonClickedSlot(bool)));
		ok = ok && QObject::connect(ui_.cancelButton, SIGNAL(clicked(bool)), this, SLOT(cancelButtonClickedSlot(bool)));
		ok = ok && QObject::connect(ui_.planetCancelButton, SIGNAL(clicked(bool)), this, SLOT(cancelButtonClickedSlot(bool)));

		ui_.hoursEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]*"), ui_.hoursEdit));
		ui_.minutesEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]*"), ui_.minutesEdit));
		ui_.secondsEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]*"), ui_.secondsEdit));

		assert(ok && "Signals not connected");
	}

	~NavigationDialog() {};

	int getHours() {
		return ui_.hoursEdit->text().toInt();
	}

	int getMinutes() {
		return ui_.minutesEdit->text().toInt();
	}

	int getSeconds() {
		return ui_.secondsEdit->text().toInt();
	}

	void setDialog(bool showWarp) {
		if (showWarp) {			
			ui_.desciptionLabel->setText(QString::fromUtf16(L"Na zvolené místo lze letět podprostorovým nebo impulsním pohonem. Pokud chceš letět impulsním pohonem, zadej ještě dobu zážehu."));
		}
		else {			
			ui_.desciptionLabel->setText(QString::fromUtf16(L"Na zvolené místo lze letět pouze impulsním pohonem. Zadej požadovanou dobu zážehu."));
		}

		ui_.standardLabel->setText(QString::fromUtf16(L"Loď může letět impulsním pohonem"));

		if (showWarp) {
			ui_.subspaceLabel->setProperty("enabled", true);
			ui_.subspaceLabel->setStyleSheet(ui_.subspaceLabel->styleSheet());
			ui_.subspaceLabel->setText(QString::fromUtf16(L"Loď může letět podprostorovým pohonem"));
			ui_.subspaceButton->setVisible(true);
		}
		else {
			ui_.subspaceLabel->setProperty("enabled", false);
			ui_.subspaceLabel->setStyleSheet(ui_.subspaceLabel->styleSheet());
			ui_.subspaceLabel->setText(QString::fromUtf16(L"Loď nemůže letět podprostorovým pohonem"));
			ui_.subspaceButton->setVisible(false);
		}

		resize(404, 349);
		ui_.imageFrame->resize(400, 345);
		ui_.mainFrame->resize(400, 345);
		ui_.planetFrame->setVisible(false);

		ui_.dockLabel->setVisible(false);
		ui_.dockReasonLabel->setVisible(false);
		ui_.dockButton->setVisible(false);

		ui_.cancelButton->setVisible(true);
	}

	void setDialog(DockingResult canDockDown) {
		ui_.desciptionLabel->setText(QString::fromUtf16(L"Na zvolené místo lze letět pouze impulsním pohonem. Zadej požadovanou dobu zážehu."));

		ui_.standardLabel->setText(QString::fromUtf16(L"Loď může letět impulsním pohonem"));

		ui_.subspaceLabel->setProperty("enabled", false);
		ui_.subspaceLabel->setStyleSheet(ui_.subspaceLabel->styleSheet());
		ui_.subspaceLabel->setText(QString::fromUtf16(L"Loď nemůže letět podprostorovým pohonem"));
		ui_.subspaceButton->setVisible(false);

		ui_.planetFrame->setVisible(false);

		if (canDockDown == DR_OK) {
			ui_.dockLabel->setProperty("enabled", true);
			ui_.dockLabel->setStyleSheet(ui_.dockLabel->styleSheet());
			ui_.dockLabel->setText(QString::fromUtf16(L"Loď může přistát na základně"));
			ui_.dockReasonLabel->setText(QString::fromUtf16(L"Vše v pořádku"));
			ui_.dockButton->setVisible(true);
		}
		else {
			ui_.dockLabel->setProperty("enabled", false);
			ui_.dockLabel->setStyleSheet(ui_.dockLabel->styleSheet());
			ui_.dockLabel->setText(QString::fromUtf16(L"Loď nemůže přistát na základně"));

			std::wstring reason;
			switch (canDockDown) {
			case DR_UNCONTROLLABLE_TARGET:
				reason = L"Cílová základna je nekontrolovatelná, lze ji obsadit, ale ne na ni přistát";
				break;
			case DR_NOT_YOUR_DOCK:
				reason = L"Cílovou základnu vlastní jiný hráč, nelze tam proto přistát";
				break;
			case DR_OUT_OF_RANGE:
				reason = L"Cílová základna není v dosahu";
				break;
			case DR_IMPULS_DRIVE_FAIL:
				reason = L"Loď nemá motory či tlumiče nebo je něco z toho rozbité";
				break;
			case DR_NOT_ENOUGH_DEUTERIUM:
				reason = L"loď nemá dost paliva na přistání";
			case DR_NO_FREE_HANGAR:
				reason = L"Cílová základna nemá žádný volný hangár";
				break;
			default:
				reason = L"Nelze přistát";
			}

			ui_.dockButton->setVisible(false);
			ui_.dockReasonLabel->setText(QString::fromUtf16(reason.c_str()));
		}

		resize(404, 504);
		ui_.imageFrame->resize(400, 500);
		ui_.mainFrame->resize(400, 500);
		ui_.planetFrame->setVisible(false);

		ui_.cancelButton->setVisible(true);
	}

	void setDialog(const NavigationPlanetDetails & planet) {
		ui_.desciptionLabel->setText(QString::fromUtf16(L"Na zvolené místo lze letět podprostorovým nebo impulsním pohonem. Pokud chceš letět impulsním pohonem, zadej ještě dobu zážehu."));

		ui_.standardLabel->setText(QString::fromUtf16(L"Loď může letět impulsním pohonem"));

		ui_.subspaceLabel->setProperty("enabled", true);
		ui_.subspaceLabel->setStyleSheet(ui_.subspaceLabel->styleSheet());
		ui_.subspaceLabel->setText(QString::fromUtf16(L"Loď může letět podprostorovým pohonem"));
		ui_.subspaceButton->setVisible(true);

		resize(804, 504);
		ui_.imageFrame->resize(800, 500);
		ui_.mainFrame->resize(400, 500);
		ui_.planetFrame->setVisible(true);

		ui_.dockLabel->setVisible(false);
		ui_.dockReasonLabel->setVisible(false);
		ui_.dockButton->setVisible(false);

		ui_.planetName->setText(QString::fromUtf8(planet.name.c_str()));
		ui_.heavyWaterModifier->setText(Settings::instance().formatNumber(planet.heavyWaterModifier * 100) + " %");
		ui_.crystalsModifier->setText(Settings::instance().formatNumber(planet.crystalsModifier * 100) + " %");
		ui_.ilmeniteModifier->setText(Settings::instance().formatNumber(planet.ilmeniteModifier * 100) + " %");

		ui_.dayTemperature->setText(Settings::instance().formatNumber(planet.dayTemperature) + QString::fromUtf16(L" °C"));
		ui_.nightTemperature->setText(Settings::instance().formatNumber(planet.nightTemperature) + QString::fromUtf16(L" °C"));

		ui_.dayLength->setText(Settings::instance().formatNumber(planet.dayPeriod) + " s");
		ui_.yearLength->setText(Settings::instance().formatNumber(planet.yearPeriod) + " s");

		ui_.sea->setText(QString::number(planet.sea));

		if (planet.type == GAS_TITAN) {
			ui_.planetType->setText(QString::fromUtf16(L"Plynový obr"));
		}
		else if (planet.type == TERESTRIAL) {
			ui_.planetType->setText(QString::fromUtf16(L"Terestická planeta"));
		}
		else {
			ui_.planetType->setText(QString::fromUtf16(L"Neznámý"));
		}

		ui_.cancelButton->setVisible(false);

	}
};

#endif