#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QProcess>
#include <QDebug>
#include <QDesktopServices>
#include <QUrl>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QFileDialog>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow), builder(this)
{
    ui->setupUi(this);

    outputDialog = new OutputDialog();

    builder.build(ui->centralWidget);

    QObject::connect(builder.getTabWidget(), SIGNAL(currentChanged(int)),
                     this, SLOT(on_tab_selected(int)));

    builder.getTabWidget()->setCurrentIndex(0);
    on_tab_selected(0);

    QRect frect = frameGeometry();
    frect.moveCenter(QDesktopWidget().availableGeometry().center());
    move(frect.topLeft());
}

MainWindow::~MainWindow()
{
    delete ui;
    delete outputDialog;
}

void MainWindow::executeCommand(bool showOutput) {

    Tool* tool = builder.getSelectedTool();
    QList<QString> errors = tool->checkValidity();

    if (!errors.isEmpty()) {
        QString str;

        for (int i = 0; i < errors.size(); i++) {
            str += "<br>" + errors.at(i);
        }
        QMessageBox::warning(ui->centralWidget, "Cannot execute command", "Detail:<br>" + str);
        return;
    }

    QString command = ui->commandPlainTextEdit->toPlainText();

    QObject parent;
    QProcess process(&parent);
    process.start(command);
    if (showOutput) {
        process.waitForFinished();
        outputDialog->setOutputText(process.readAll());
        outputDialog->show();
    }
}

void MainWindow::on_actionRun_triggered()
{
    executeCommand(true);
}

void MainWindow::on_tab_selected(int index) {
    Tool* tool = builder.getSelectedTool();

    QStringList args = tool->getCommandArgs();
    QString cmd = "";
    QStringListIterator it(args);
    while (it.hasNext()) {
        QString tmp = it.next();
        cmd += tmp + " ";
    }

    ui->commandPlainTextEdit->clear();
    ui->commandPlainTextEdit->appendHtml("<b>" + tool->getCommand() + "</b> " + cmd);
}

void MainWindow::on_switcher_value_changed() {
    on_tab_selected(builder.getTabWidget()->currentIndex());
}

void MainWindow::on_actionHelp_triggered()
{
    QDesktopServices::openUrl(QUrl(builder.getSelectedTool()->getHomepage()));
}

void MainWindow::on_actionExit_triggered()
{
    close();
}

void MainWindow::on_actionAbout_triggered()
{
	QString about = "<br><p align='center'><big><b>TG</b> is a tool for creation graphical user interface(gui) from xml files for any kind of programs. </big></p> <br> \
					<li><big> Version 1.0.0 </big></li> \
					<li><big> Created in Mai 2011 </big></li>  \
					<li><big> Based on Qt 4.7.0 (32 bit) </big></li> \
					<li><big> Product is licensed under the GNU General Public License. </big></li><br>\
					<p align='center'> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \
						EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF \
						MERCHANTABILITY </p>";
    QMessageBox::about(ui->centralWidget, "About TG", about);
}

void MainWindow::on_actionSave_As_triggered()
{
    QString fileName = QFileDialog::getSaveFileName(this, "Save Project", "", "TG Project File");
    if (!fileName.endsWith(".tgp")) fileName = fileName + ".tgp";
    builder.saveProject(fileName);
}

void MainWindow::on_actionOpen_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Open Project", "", "TG Project File (*.tgp)");

    if (!fileName.isNull()) builder.openProject(fileName);
}
