/*
 * This file Copyright (C) 2009-2015 Mnemosyne LLC
 *
 * It may be used under the GNU GPL versions 2 or 3
 * or any future license endorsed by Mnemosyne LLC.
 *
 */

#pragma once

#include <QCryptographicHash>
#include <QDir>
#include <QFile>
#include <QMap>
#include <QString>
#include <QTimer>
#include <QVector>

#include "AddData.h" // AddData
#include "BaseDialog.h"
#include "Torrent.h" // FileList

#include "ui_OptionsDialog.h"

class Prefs;
class Session;

extern "C"
{
struct tr_variant;
}

class OptionsDialog : public BaseDialog
{
    Q_OBJECT

public:
    OptionsDialog(Session& session, const Prefs& prefs, const AddData& addme, QWidget* parent = nullptr);
    virtual ~OptionsDialog();

private:
    typedef QMap<uint32_t, int32_t> mybins_t;

private:
    void reload();
    void updateWidgetsLocality();
    void clearInfo();
    void clearVerify();

private slots:
    void onAccepted();
    void onPriorityChanged(const QSet<int>& fileIndices, int);
    void onWantedChanged(const QSet<int>& fileIndices, bool);
    void onVerify();
    void onTimeout();

    void onSourceChanged();
    void onDestinationChanged();

    void onSessionUpdated();

private:
    Session& mySession;
    AddData myAdd;

    Ui::OptionsDialog ui;

    bool myIsLocal;
    QDir myLocalDestination;
    bool myHaveInfo;
    tr_info myInfo;
    QPushButton* myVerifyButton;
    QVector<int> myPriorities;
    QVector<bool> myWanted;
    FileList myFiles;

    QTimer myVerifyTimer;
    char myVerifyBuf[2048 * 4];
    QFile myVerifyFile;
    uint64_t myVerifyFilePos;
    int myVerifyFileIndex;
    uint32_t myVerifyPieceIndex;
    uint32_t myVerifyPiecePos;
    QVector<bool> myVerifyFlags;
    QCryptographicHash myVerifyHash;
    mybins_t myVerifyBins;
    QTimer myEditTimer;
};