/*
 * Squawk messenger.
 * Copyright (C) 2019 Yury Gubich <blue@macaw.me>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include "pagegeneral.h"
#include "ui_pagegeneral.h"

PageGeneral::PageGeneral(QWidget* parent):
    QWidget(parent),
    m_ui(new Ui::PageGeneral()),
    dialog(nullptr)
{
    m_ui->setupUi(this);

    QSettings settings;
    m_ui->downloadsPathInput->setText(settings.value("downloadsPath").toString());
    if (QSystemTrayIcon::isSystemTrayAvailable()) {
        bool tray = settings.value("tray", false).toBool();
        m_ui->trayInput->setChecked(tray);
        if (tray) {
            m_ui->hideTrayInput->setChecked(settings.value("hideTray", false).toBool());
        } else {
            m_ui->hideTrayInput->setEnabled(false);
        }

        connect(m_ui->trayInput, &QCheckBox::stateChanged, this, &PageGeneral::onTrayChecked);
        connect(m_ui->hideTrayInput, &QCheckBox::stateChanged, this, &PageGeneral::onHideTrayChecked);
    } else {
        m_ui->trayInput->setEnabled(false);
        m_ui->hideTrayInput->setEnabled(false);
        m_ui->trayInput->setToolTip(tr("Tray is not available for your system"));       //TODO translate
    }

    connect(m_ui->downloadsPathButton, &QPushButton::clicked, this, &PageGeneral::onBrowseButtonClicked);
}

PageGeneral::~PageGeneral()
{
    if (dialog != nullptr) {
        dialog->deleteLater();
    }
}

void PageGeneral::onBrowseButtonClicked()
{
    if (dialog == nullptr) {
        QSettings settings;
        dialog = new QFileDialog(this, tr("Select where downloads folder is going to be"), settings.value("downloadsPath").toString());
        dialog->setAttribute(Qt::WA_DeleteOnClose);
        dialog->setAcceptMode(QFileDialog::AcceptSave);                 //I find it the most convinient way
        dialog->setFileMode(QFileDialog::AnyFile);                      //Otherwise the directory is supposed to be
        dialog->setOption(QFileDialog::ShowDirsOnly, true);             //selected and not to be navigated
        dialog->setOption(QFileDialog::DontConfirmOverwrite, true);
        dialog->setModal(true);
        connect(dialog, &QFileDialog::accepted, this, &PageGeneral::onDialogAccepted);
        connect(dialog, &QFileDialog::destroyed, this, &PageGeneral::onDialogDestroyed);
        dialog->show();
    } else {
        dialog->show();
        dialog->raise();
        dialog->activateWindow();
    }
}

void PageGeneral::onDialogAccepted()
{
    QStringList files = dialog->selectedFiles();
    QString path;
    if (files.size() > 0) {
        path = files[0];
    } else {
        path = dialog->directory().canonicalPath();
    }
    m_ui->downloadsPathInput->setText(path);
    emit variableModified("downloadsPath", path);
}

void PageGeneral::onDialogDestroyed()
{
    dialog = nullptr;
}

void PageGeneral::onTrayChecked(int state)
{
    bool enabled = state == Qt::Checked;
    emit variableModified("tray", enabled);
    m_ui->hideTrayInput->setEnabled(enabled);
    if (!enabled) {
        m_ui->hideTrayInput->setChecked(false);
    }
}

void PageGeneral::onHideTrayChecked(int state)
{
    bool enabled = state == Qt::Checked;
    emit variableModified("hideTray", enabled);
}