// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "projectselectionwidget.hpp"
#include "ui_projectselectionwidget.h"
#include "mainwindow/vssettings.hpp"
#include "libvideostitch-base/file.hpp"

#include <QFileInfo>
#include <QDropEvent>
#include <QMimeData>
#include <QPair>
#include <QDesktopServices>

static const int FULL_PATH(1);
static const int ITEM_HEIGHT(30);
static const int LIST_MARGIN(20);

ProjectSelectionWidget::ProjectSelectionWidget(QWidget *parent) : QFrame(parent), ui(new Ui::ProjectSelectionWidget) {
  ui->setupUi(this);
  connect(ui->buttonOpenProject, &QPushButton::clicked, this, &ProjectSelectionWidget::notifyProjectOpened);
  connect(ui->buttonNewProject, &QPushButton::clicked, this, &ProjectSelectionWidget::notifyNewProject);
  connect(ui->listRecentlyOpened, &QListWidget::clicked, this, &ProjectSelectionWidget::onProjectSelected);
  ui->dropArea->setAcceptDrops(true);
  ui->dropArea->installEventFilter(this);
  ui->labelDropIcon->hide();
  ui->labelDropHere->hide();
  ui->buttonNewProject->setProperty("vs-button-action", true);
  ui->buttonOpenProject->setProperty("vs-button-action", true);
  const QString supported = ui->labelDragDropHere->text();
  QString formats;
  if (QCoreApplication::applicationName() == VIDEOSTITCH_STUDIO_APP_NAME) {
    formats = tr("media, PTV or PTVB");
  } else {
    formats = tr("VAH");
  }
  ui->labelDragDropHere->setText(supported.arg(formats));
  loadRecentProjects();
}

ProjectSelectionWidget::~ProjectSelectionWidget() { delete ui; }

void ProjectSelectionWidget::onContentUpdated() { loadRecentProjects(); }

void ProjectSelectionWidget::onProjectSelected(const QModelIndex &index) {
  emit notifyProjectSelected(index.data(FULL_PATH).toString());
}

void ProjectSelectionWidget::onSampleSelected(const QModelIndex &index) {
  QDesktopServices::openUrl(index.data(FULL_PATH).toString());
}

bool ProjectSelectionWidget::eventFilter(QObject *watched, QEvent *event) {
  if (watched == ui->dropArea) {
    if (event->type() == QEvent::Type::DragEnter) {
      event->setAccepted(true);
      ui->labelDropIcon->show();
      ui->labelDragIcon->hide();
      ui->labelDropHere->show();
      ui->labelDragDropHere->hide();
    } else if (event->type() == QEvent::Type::DragLeave) {
      ui->labelDropIcon->hide();
      ui->labelDragIcon->show();
      ui->labelDropHere->hide();
      ui->labelDragDropHere->show();
    } else if (event->type() == QEvent::Type::Drop) {
      QDropEvent *dropEvent = static_cast<QDropEvent *>(event);
      emit notifyFilesDropped(dropEvent);
      ui->labelDropIcon->hide();
      ui->labelDragIcon->show();
      ui->labelDropHere->hide();
      ui->labelDragDropHere->show();
    }
  }
  return QObject::eventFilter(watched, event);
}

void ProjectSelectionWidget::loadRecentProjects() {
  ui->listRecentlyOpened->clear();
  const QStringList files = VSSettings::getSettings()->getRecentFileList();
  foreach (auto name, files) {
    if (QFileInfo(name).exists()) {
      const QString text = tr("%0. %1").arg(ui->listRecentlyOpened->count() + 1).arg(File::strippedName(name));
      QListWidgetItem *item = new QListWidgetItem(text, ui->listRecentlyOpened);
      item->setTextAlignment(Qt::AlignVCenter);
      item->setData(FULL_PATH, name);
      item->setSizeHint(QSize(ui->listRecentlyOpened->width() - 10, ITEM_HEIGHT));
      ui->listRecentlyOpened->addItem(item);
    }
  }
  ui->labelRecentTitle->setVisible(!files.isEmpty());
  ui->listRecentlyOpened->setVisible(!files.isEmpty());
  ui->listRecentlyOpened->adjustSize();
  ui->listRecentlyOpened->setFixedHeight(ui->listRecentlyOpened->count() * ITEM_HEIGHT + LIST_MARGIN);
}