#include <QtWidgets>
#include <QtGlobal>

#include "pdf_file_widget.h"
#include "pdf_page_widget.h"

#define COLLAPSE_BUTTON_WIDTH   32
#define COLLAPSE_BUTTON_HEIGHT  32

#define CHILD_AREA_WIDTH        150
#define CHILD_AREA_HEIGHT       150

#define CHILD_AREA_SIDE_MARGIN  6

PagesContainerWidget::PagesContainerWidget(QWidget* parent) {
  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
  /*setAcceptDrops(true);*/
  mainLayout = new QHBoxLayout();

  setLayout(mainLayout);
}

int PagesContainerWidget::getPagesCount() const {
  return pageWidgets.size();
}

QSize PagesContainerWidget::sizeHint() const {
  return QSize((CHILD_AREA_SIDE_MARGIN + CHILD_AREA_WIDTH)*getPagesCount(), CHILD_AREA_HEIGHT + 22);
}

void PagesContainerWidget::addPageWidget(PDFPageWidget* pageWidget) {
  pageWidgets.append(pageWidget);
  mainLayout->addWidget(pageWidget);
  adjustSize();
}

void PagesContainerWidget::dragEnterEvent(QDragEnterEvent* event) {
  event->acceptProposedAction();
}

void PagesContainerWidget::dropEvent(QDropEvent* event) {
  event->acceptProposedAction();
}

void PagesContainerWidget::mousePressEvent(QMouseEvent* event) {
  if(event->button() == Qt::LeftButton) {
    int draggedChild = (findPageContainingClickEvent(event->pos()));

    QDrag* drag = new QDrag(this);
    QMimeData* mimeData = new QMimeData;

    mimeData->setText(QString::number(draggedChild));
    drag->setMimeData(mimeData);
    drag->setPixmap(QPixmap(":/img/copy.png"));

    Qt::DropAction dropAction = drag->exec();
  }
}

int PagesContainerWidget::findPageContainingClickEvent(QPoint pos) {
  for(int i = 0; i < getPagesCount(); i++)
    if(pageWidgets[i]->geometry().contains(pos))
      return i;
  
  return getPagesCount()-1;
}

int PagesContainerWidget::findPageWidgetInLayout(PDFPageWidget* pageWidget) {
  for(int i = 0; i < getPagesCount(); i++)
    if(mainLayout->itemAt(i)->widget() == pageWidget)
      return i;

  return getPagesCount()-1;
}

PDFFileWidget::PDFFileWidget(QWidget* parent) {
  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);

  topLayout       = new QGridLayout();

  collapseButton  = new QPushButton();
  collapseButton->resize(QSize(COLLAPSE_BUTTON_WIDTH, COLLAPSE_BUTTON_HEIGHT));
  collapseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
  collapseButton->setIcon(QIcon(":/img/collapse.png"));
  connect(collapseButton, SIGNAL(released()), this, SLOT(collapsedButtonClick()));
  topLayout->addWidget(collapseButton, 0, 0);

  fileNameLabel = new QLabel();
  topLayout->addWidget(fileNameLabel, 0, 1);
  
  pagesContainerWidget = new PagesContainerWidget();
  scrollArea = new QScrollArea();
  scrollArea->setWidget(pagesContainerWidget);
  topLayout->addWidget(scrollArea, 1, 0, 1, 5);

  setLayout(topLayout);

  setCollapsed(false);

  connect(&tgen, SIGNAL(updateThumbnail(QImage,PDFPageWidget*)), this,
          SLOT(updateThumbnail(QImage,PDFPageWidget*)));
}

void PDFFileWidget::updateThumbnail(QImage img, PDFPageWidget* pw) {
  pw->setThumbnail(img);
}

void PDFFileWidget::setCollapsed(bool state) {
  collapsed = state;
  if(state == true) {
    scrollArea->hide();
    collapseButton->setIcon(QIcon(":/img/expand.png"));
  } else {
    scrollArea->show();
    collapseButton->setIcon(QIcon(":img/collapse.png"));
  }
}

void PDFFileWidget::collapsedButtonClick(void) {
  setCollapsed(!collapsed);
}

void PDFFileWidget::pageClickedHandler(QMouseEvent*, QImage) {

}

void PDFFileWidget::setDocument(Poppler::Document* document, QString fileName) {
  document->setRenderHint(Poppler::Document::TextAntialiasing);
  Poppler::Document* doc = Poppler::Document::load(fileName);
  doc->setRenderHint(Poppler::Document::TextAntialiasing);

  int numPages = document->numPages();
  for(int i = 0; i < numPages; i++) {
    Poppler::Page* pdfPage = document->page(i);

    PDFPageWidget* pageWidget = new PDFPageWidget();
  
    pageWidget->setAncestor(ancestor);
    pageWidget->setFather(this);
    pageWidget->setPopplerPage(doc->page(i));
    tgen.render(pageWidget, pdfPage);

    pagesContainerWidget->addPageWidget(pageWidget);
    /* Process event. */
    /*qApp->processEvents();*/
  }
  tgen.start();
  fileNameLabel->setText(fileName);
}

int PDFFileWidget::removeChild(PDFPageWidget* child) {
  int pos = pagesContainerWidget->pageWidgets.indexOf(child);
  pagesContainerWidget->pageWidgets.remove(pos);
  pagesContainerWidget->mainLayout->removeItem(pagesContainerWidget->mainLayout->itemAt(pos));

  return pos;
}

void PDFFileWidget::insertChildAt(PDFPageWidget* child, int pos) {
  child->setFather(this);
  pagesContainerWidget->mainLayout->insertWidget(pos, child);
  pagesContainerWidget->pageWidgets.insert(pos, child);
}