

#include "versioncontrolwidget.h"

#include <QLabel>
#include <QVBoxLayout>
#include <QSpinBox>
#include <QTimeEdit>
#include <QTextEdit>
#include <QDateTimeEdit>
#include <QRadioButton>

//=============================================================================
// DateChooserWidget
//-----------------------------------------------------------------------------

DateChooserWidget::DateChooserWidget(QWidget *parent)
    : QWidget(parent), m_selectedRadioIndex(0) {
  QVBoxLayout *mainLayout = new QVBoxLayout;
  mainLayout->setContentsMargins(0, 0, 0, 0);
  mainLayout->setAlignment(Qt::AlignTop);

  // Time
  QHBoxLayout *timeLayout = new QHBoxLayout;

  m_timeRadioButton = new QRadioButton;
  m_timeRadioButton->setChecked(true);
  connect(m_timeRadioButton, SIGNAL(clicked()), this,
          SLOT(onRadioButtonClicked()));

  m_timeEdit = new QTimeEdit;
  m_timeEdit->setDisplayFormat("hh:mm");

  timeLayout->addWidget(m_timeRadioButton);
  timeLayout->addWidget(m_timeEdit);
  timeLayout->addWidget(new QLabel(tr("time ago.")));
  timeLayout->addStretch();
  mainLayout->addLayout(timeLayout);

  // Days
  QHBoxLayout *dayLayout = new QHBoxLayout;

  m_dayRadioButton = new QRadioButton;
  connect(m_dayRadioButton, SIGNAL(clicked()), this,
          SLOT(onRadioButtonClicked()));

  m_dayEdit = new QSpinBox;
  m_dayEdit->setRange(1, 99);
  m_dayEdit->setValue(1);
  m_dayEdit->setEnabled(false);

  dayLayout->addWidget(m_dayRadioButton);
  dayLayout->addWidget(m_dayEdit);
  dayLayout->addWidget(new QLabel(tr("days ago.")));
  dayLayout->addStretch();
  mainLayout->addLayout(dayLayout);

  // Weeks
  QHBoxLayout *weekLayout = new QHBoxLayout;

  m_weekRadioButton = new QRadioButton;
  connect(m_weekRadioButton, SIGNAL(clicked()), this,
          SLOT(onRadioButtonClicked()));

  m_weekEdit = new QSpinBox;
  m_weekEdit->setRange(1, 99);
  m_weekEdit->setValue(1);
  m_weekEdit->setEnabled(false);

  weekLayout->addWidget(m_weekRadioButton);
  weekLayout->addWidget(m_weekEdit);
  weekLayout->addWidget(new QLabel(tr("weeks ago.")));
  weekLayout->addStretch();
  mainLayout->addLayout(weekLayout);

  // Custom date
  QHBoxLayout *customDateLayout = new QHBoxLayout;

  m_dateRadioButton = new QRadioButton;
  connect(m_dateRadioButton, SIGNAL(clicked()), this,
          SLOT(onRadioButtonClicked()));

  m_dateTimeEdit = new QDateTimeEdit;
  m_dateTimeEdit->setDisplayFormat("yyyy-MM-dd hh:mm");
  QDate now = QDate::currentDate();
  m_dateTimeEdit->setMaximumDate(now);
  m_dateTimeEdit->setDate(now);
  m_dateTimeEdit->setEnabled(false);
  m_dateTimeEdit->setCalendarPopup(true);

  customDateLayout->addWidget(m_dateRadioButton);
  customDateLayout->addWidget(m_dateTimeEdit);
  customDateLayout->addWidget(new QLabel(tr("( Custom date )")));
  customDateLayout->addStretch();
  mainLayout->addLayout(customDateLayout);

  setLayout(mainLayout);
}

//-----------------------------------------------------------------------------

void DateChooserWidget::disableAllWidgets() {
  m_timeEdit->setEnabled(false);
  m_dayEdit->setEnabled(false);
  m_weekEdit->setEnabled(false);
  m_dateTimeEdit->setEnabled(false);
}

//-----------------------------------------------------------------------------

void DateChooserWidget::onRadioButtonClicked() {
  QObject *obj         = sender();
  QRadioButton *button = dynamic_cast<QRadioButton *>(obj);

  if (!button) return;

  disableAllWidgets();

  if (button == m_timeRadioButton) {
    m_timeEdit->setEnabled(true);
    m_selectedRadioIndex = 0;
  } else if (button == m_dayRadioButton) {
    m_dayEdit->setEnabled(true);
    m_selectedRadioIndex = 1;
  } else if (button == m_weekRadioButton) {
    m_weekEdit->setEnabled(true);
    m_selectedRadioIndex = 2;
  } else if (button == m_dateRadioButton) {
    m_dateTimeEdit->setEnabled(true);
    m_selectedRadioIndex = 3;
  }
}

//-----------------------------------------------------------------------------

QString DateChooserWidget::getRevisionString() const {
  QString timeString;
  QString dateString;

  QDate today = QDate::currentDate();

  if (m_selectedRadioIndex == 0)  // Time
  {
    QTime currentTime = QTime::currentTime();
    QTime t           = m_timeEdit->time();
    int seconds       = t.hour() * 60 * 60 + t.minute() * 60;
    currentTime       = currentTime.addSecs(-seconds);
    timeString        = currentTime.toString("hh:mm");
    dateString        = today.toString("yyyy-MM-dd");
  } else if (m_selectedRadioIndex == 1)  // Days
  {
    timeString = "00:00";
    today      = today.addDays(-(m_dayEdit->value()));
    dateString = today.toString("yyyy-MM-dd");
  } else if (m_selectedRadioIndex == 2)  // Weeks
  {
    timeString = "00:00";
    today      = today.addDays(-(m_weekEdit->value() * 7));
    dateString = today.toString("yyyy-MM-dd");
  } else  // Custom date
  {
    QTime time = m_dateTimeEdit->time();
    timeString = time.toString("hh:mm");

    QDate date = m_dateTimeEdit->date();
    dateString = date.toString("yyyy-MM-dd");
  }

  return "{" + dateString + " " + timeString + "}";
}

//-----------------------------------------------------------------------------

//=============================================================================
// ConflictWidget
//-----------------------------------------------------------------------------

ConflictWidget::ConflictWidget(QWidget *parent)
    : QWidget(parent), m_button1Text(tr("Mine")), m_button2Text(tr("Theirs")) {
  m_mainLayout = new QVBoxLayout;
  m_mainLayout->setContentsMargins(0, 0, 0, 0);
  m_mainLayout->setAlignment(Qt::AlignTop);
  setLayout(m_mainLayout);
}

//-----------------------------------------------------------------------------

void ConflictWidget::setFiles(const QStringList &files) {
  DoubleRadioWidget *radio = 0;
  int fileCount            = files.size();
  for (int i = 0; i < fileCount; i++) {
    radio = new DoubleRadioWidget(m_button1Text, m_button2Text, files.at(i));
    connect(radio, SIGNAL(valueChanged()), this, SLOT(onRadioValueChanged()));
    m_mainLayout->addWidget(radio);
    m_radios.insert(radio, -1);
  }
  m_mainLayout->addStretch();
}

//-----------------------------------------------------------------------------

void ConflictWidget::onRadioValueChanged() {
  DoubleRadioWidget *obj = dynamic_cast<DoubleRadioWidget *>(sender());
  if (obj) m_radios[obj] = obj->getValue();

  if (!m_radios.values().contains(-1)) emit allConflictSetted();
}

//-----------------------------------------------------------------------------

QStringList ConflictWidget::getFilesWithOption(int option) const {
  QStringList files;
  QMap<DoubleRadioWidget *, int>::const_iterator i;
  for (i = m_radios.constBegin(); i != m_radios.constEnd(); ++i) {
    if (i.value() == option) files << i.key()->getText();
  }
  return files;
}

//=============================================================================
// DoubleRadioWidget
//-----------------------------------------------------------------------------

DoubleRadioWidget::DoubleRadioWidget(const QString &button1Text,
                                     const QString &button2Text,
                                     const QString &text, QWidget *parent)
    : QWidget(parent)

{
  QHBoxLayout *mainLayout = new QHBoxLayout;
  mainLayout->setContentsMargins(0, 0, 0, 0);

  m_firstButton = new QRadioButton(button1Text);
  connect(m_firstButton, SIGNAL(clicked()), this, SIGNAL(valueChanged()));
  m_secondButton = new QRadioButton(button2Text);
  connect(m_secondButton, SIGNAL(clicked()), this, SIGNAL(valueChanged()));

  m_label = new QLabel;
  m_label->setFixedWidth(180);
  m_label->setText(text);

  mainLayout->addWidget(m_label);
  mainLayout->addSpacing(20);
  mainLayout->addWidget(m_firstButton);
  mainLayout->addWidget(m_secondButton);

  setLayout(mainLayout);
}

//-----------------------------------------------------------------------------

int DoubleRadioWidget::getValue() const {
  if (m_firstButton->isChecked())
    return 0;
  else if (m_secondButton->isChecked())
    return 1;
  else
    return -1;
}

//-----------------------------------------------------------------------------

QString DoubleRadioWidget::getText() const { return m_label->text(); }
