#include <QtGui>
#include <QtXml>
#include <QFile>
#include <QGridLayout>

#include <fstream>
#include <string>

#include "MainWindow.h"
#include "Grille.h"
#include "SudokuXML.h"

MainWindow::MainWindow()
 : grid(0)
 {
    init();
	setWindowTitle(tr("Sudoka :: The ultimate Sudoku software !"));
	setMinimumSize(QSize(320,360));
}


MainWindow::~MainWindow()
{
	writeSettings();
	delete grid;
}


//! Initilize all elements
void MainWindow::init()
{
	setAttribute(Qt::WA_DeleteOnClose);
	createActions();
	createMenus();
	createToolbars();
	readSettings();
	
	grid = new Grid;
	buildInterface();
}


//! Build the interface from the System pointer
void MainWindow::buildInterface()
{
	viewer = new Viewer(grid, width(), height(), this);
	setCentralWidget(viewer);
}

//! About dialog box
void MainWindow::about()
{
	QPixmap pixmap(":/images/SudokaImg.png");
	QSplashScreen *splash = new QSplashScreen(pixmap);
	splash->showMessage("Click to close...");
	splash->show();
}

//! Technical information about this program
void MainWindow::info()
{
	QMessageBox::aboutQt(this);
}


//! Read only few settings (window properties)
void MainWindow::readSettings()
{
    QSettings settings("Romain", "Sudoka");
    QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
    QSize size = settings.value("size", QSize(400, 400)).toSize();
    move(pos);
    resize(size);
}

//! Write window settings
void MainWindow::writeSettings()
{
    QSettings settings("Romain", "Sudoka");
    settings.setValue("pos", pos());
    settings.setValue("size", size());
}




void MainWindow::createActions()
{
    // applications actions
	openAct = new QAction(QIcon(":/images/open.png"), tr("&Load Sudoka-XML File"), this);
    openAct->setShortcut(tr("Ctrl+O"));
    connect(openAct, SIGNAL(triggered()), this, SLOT(openDir()));

    aboutAct = new QAction(QIcon(":/images/about.png"), tr("&About"), this);
    aboutAct->setStatusTip(tr("Some information about Sudoka"));
    aboutAct->setShortcut(tr("F1"));
    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

    infoAct = new QAction(QIcon(":/images/qt.png"), tr("&Technical information"), this);
    infoAct->setStatusTip(tr("Technical information about Sudoka"));
    infoAct->setShortcut(tr("F2"));
    connect(infoAct, SIGNAL(triggered()), this, SLOT(info()));

    quitAct = new QAction(QIcon(":/images/quit.png"),tr("&Exit"), this);
    quitAct->setShortcut(tr("Ctrl+X"));
    quitAct->setStatusTip(tr("Quit this application"));
    connect(quitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
}


//! Create the menu and the toolbar
void MainWindow::createMenus()
{
	// The 'File' menu
	fileMenu = menuBar()->addMenu(tr("&File"));
	fileMenu->addAction(openAct);
	fileMenu->addSeparator();
	fileMenu->addAction(quitAct);

	menuBar()->addSeparator();

    helpMenu = menuBar()->addMenu(tr("&Help"));
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(infoAct);
}

//! Create the toolbars
void MainWindow::createToolbars()
{
    toolBar = addToolBar(tr("Actions"));
	toolBar->addAction(openAct);
	toolBar->addAction(quitAct);
	toolBar->addSeparator();
	toolBar->addAction(aboutAct);
	toolBar->addAction(infoAct);
}

//! Open a file...
void MainWindow::openDir()
{
	QString fileName =
            QFileDialog::getOpenFileName(this, tr("Open Sudoka-XML File"),
                                         QDir::currentPath(),
                                         tr("Sudoka-XML Files (*.sxml *.xml)"));
	if (fileName.isEmpty())
		return;
	loadXML(fileName);
	viewer->repaint();
}

//! Load the XML file and convert it into 'Grid'
void MainWindow::loadXML(const QString& nameXML)
{
	using namespace std;

	XMLSudoka sudoku;

	QFile fileXML(nameXML);

	QXmlSimpleReader xmlReader;
	SudokuXML handler(&sudoku);

	QXmlInputSource *source = new QXmlInputSource(&fileXML);
	xmlReader.setContentHandler(&handler);
    xmlReader.parse(source);

	sudoku.data.replace(QString("-"), QString("0"));
	sudoku.data.replace(QString("\n"), QString(""));
	sudoku.data.replace(QString("\r"), QString(""));
	sudoku.data.replace(QString(" "), QString(""));

	string   str = sudoku.data.toStdString();
	int tab[9][9];
	int i = 0, j = 0;
	for (string::const_iterator iter = str.begin(); iter != str.end(); ++iter)
	{
		if (i > 8) {
			++j; i = 0;
		}

		int v = *iter - '0';
		if (v < 0 || v > 9)
			v = 9;
		tab[i][j] = v;
		++i;
	}

	name = sudoku.name;
	grid->load(tab);
	viewer->actualize(grid);
	viewer->repaint();
}




