#include <QtWidgets>
#include <QtGlobal>
#include "pdf_factory.h"
#include "pdf_table_widget.h"
#include "pdf_preview_widget.h"
#include "pdf_page_widget.h"

PDFFactory::PDFFactory(void) {
  createWidgets();
  createActions();
  createToolBars();
  createRibbon();
  createStatusBar();
}

/* Create the shit we need for our window. */
void PDFFactory::createWidgets(void) {
  /* Set central widget to be the container root. */
  centralWidget = new QWidget();
  QVBoxLayout* layout = new QVBoxLayout();
  layout->setContentsMargins(2, 2, 2, 2);
  centralWidget->setLayout(layout);
  setCentralWidget(centralWidget);

  /* Create ribbon. */
  ribbon = new QTabWidget();
  ribbon->addTab(new QWidget(), tr("File"));
  ribbon->addTab(new QWidget(), tr("Edit"));
  ribbon->addTab(new QWidget(), tr("View"));
  ribbon->addTab(new QWidget(), tr("Help"));
  ribbon->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
  ribbon->setFixedHeight(100);
  layout->addWidget(ribbon);

  /* Create main area (table). */
  pdfTableView = new PDFTableWidget();

  pdfPreview = new PDFPreviewWidget();
  pdfPreview->setMinimumWidth(100);
  splitter = new QSplitter();
  splitter->setOrientation(Qt::Horizontal);
  splitter->addWidget(pdfTableView);
  splitter->addWidget(pdfPreview);
  QList<int> splitterWidgetSizes;
  splitterWidgetSizes << 900 << 400;
  splitter->setSizes(splitterWidgetSizes);
  splitter->setStretchFactor(0, 1);
  splitter->setStretchFactor(1, 0.5);
  layout->addWidget(splitter);

  connect(pdfTableView, SIGNAL(previewUpdate(Poppler::Page*)), pdfPreview,
          SLOT(previewUpdate(Poppler::Page*)));

  setWindowIcon(QIcon(":/img/hpdf.png"));
  setWindowTitle(tr("HPDF"));
  setGeometry(0, 0, 1300, 650);
}

void PDFFactory::createActions(void) {
  openAction = new QAction(tr("&Open"), this);
  openAction->setIcon(QIcon(":/img/open.png"));
  openAction->setShortcut(tr("Ctrl+O"));
  openAction->setStatusTip(tr("Open a PDF"));
  connect(openAction, SIGNAL(triggered()), this, SLOT(openFile()));

  exportAction = new QAction(tr("&Export a single file"), this);
  exportAction->setIcon(QIcon(":/img/export.png"));
  exportAction->setShortcut(tr("Ctrl+S"));
  exportAction->setStatusTip(tr("Export the selected file to a new PDF"));
  /*connect(saveAction, SIGNAL(triggered()), this, SLOT(save()))*/

  exportAllAction = new QAction(tr("Combine all"), this);
  exportAllAction->setIcon(QIcon(":/img/exportall.png"));
  exportAllAction->setShortcut(tr("Shift+Ctrl+S"));
  exportAllAction->setStatusTip(tr("Export all to multiple PDF files"));
  /*connect(saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs()))*/
  
  cutAction = new QAction(tr("C&ut"), this);
  cutAction->setIcon(QIcon(":/img/cut.png"));
  cutAction->setShortcut(tr("Ctrl+X"));
  cutAction->setStatusTip(tr("Cut selected contents to clipboard"));
  /*connect(cutAction, SIGNAL(triggered()), this, SLOT(cut()))*/

  copyAction = new QAction(tr("&Copy"), this);
  copyAction->setIcon(QIcon(":/img/copy.png"));
  copyAction->setShortcut(tr("Ctrl+C"));
  copyAction->setStatusTip(tr("Copy selected contents to clipboard"));
  /*connect(copyAction, SIGNAL(triggered()), this, SLOT(copy()))*/

  pasteAction = new QAction(tr("&Paste"), this);
  pasteAction->setIcon(QIcon(":/img/paste.png"));
  pasteAction->setShortcut(tr("Ctrl+V"));
  pasteAction->setStatusTip(tr("Paste clipboard's contents into current selection"));
  /*connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste()))*/

  aboutAction = new QAction(tr("A&bout"), this);
  aboutAction->setIcon(QIcon(":/img/about.png"));
  aboutAction->setStatusTip(tr("About this program"));
}

void PDFFactory::createToolBars() {
  fileToolBar = new QToolBar(tr("File"));
  fileToolBar->addAction(openAction);
  fileToolBar->addAction(exportAction);
  fileToolBar->addAction(exportAllAction);
  fileToolBar->setIconSize(QSize(48, 48));

  editToolBar = new QToolBar(tr("Edit"));
  editToolBar->addAction(cutAction);
  editToolBar->addAction(copyAction);
  editToolBar->addAction(pasteAction);
  editToolBar->setIconSize(QSize(48, 48));

  helpToolBar = new QToolBar(tr("Help"));
  helpToolBar->addAction(aboutAction);
  helpToolBar->setIconSize(QSize(48, 48));
}

void PDFFactory::createRibbon(void) {
 QWidget* tabFile = ribbon->widget(0);
 QVBoxLayout* layoutTabFile = new QVBoxLayout();
 layoutTabFile->setContentsMargins(2, 0, 2, 0);
 layoutTabFile->addWidget(fileToolBar);
 tabFile->setLayout(layoutTabFile);

 QWidget* tabEdit = ribbon->widget(1);
 QVBoxLayout* layoutTabEdit = new QVBoxLayout();
 layoutTabEdit->setContentsMargins(2, 0, 2, 0);
 layoutTabEdit->addWidget(editToolBar);
 tabEdit->setLayout(layoutTabEdit);

 QWidget* tabHelp = ribbon->widget(3);
 QVBoxLayout* layoutTabHelp = new QVBoxLayout();
 layoutTabHelp->setContentsMargins(2, 0, 2, 0);
 layoutTabHelp->addWidget(helpToolBar);
 tabHelp->setLayout(layoutTabHelp);
}

void PDFFactory::createStatusBar(void) {
  statusBar()->showMessage(tr(""));
}

void PDFFactory::openFile(void) {
  QStringList fileNames = QFileDialog::getOpenFileNames(this,
      tr("Open PDF file"), ".",
      tr("PDF file (*.pdf)"));

  for(int i = 0; i < fileNames.size(); i++) {
    QString fileName = fileNames.at(i);
    if(!fileName.isEmpty()) {
        pdfTableView->loadFile(fileName);
    }
  }
}