#ifndef GIT_CLIENT_H_INCLUDED
#define GIT_CLIENT_H_INCLUDED

#include <QObject>
#include <QStringList>
#include <optional>

#include "process/command.h"
#include "ismas/ismas_client.h"

class Worker;
class GitClient : public QObject {
    Q_OBJECT

    Worker *m_worker;
    QString const m_repositoryPath;
    QString const m_customerNr;
    QString const m_workingDirectory;
    QString m_branchName;
    QString const m_customerRepository;

    bool copyGitConfigFromMaster();

  public:
    explicit GitClient(QString const &customerNrStr,
                       QString const &repositoryPath,
                       QString const &workingDirectory = QCoreApplication::applicationDirPath(),
                       QString const &branchName = "master",
                       QObject *parent = 0);

    bool gitCloneCustomerRepository();
    bool gitCheckoutBranch();
    QStringList gitBranchNames();

    QString const workingDirectory() const { return m_workingDirectory; }
    QString workingDirectory() { return m_workingDirectory; }

    QString const branchName() const { return m_branchName; }
    QString branchName() { return m_branchName; }

    QString repositoryPath() { return m_repositoryPath; }
    QString const repositoryPath() const { return m_repositoryPath; }

    bool gitCloneAndCheckoutBranch();

    Worker *worker() { return m_worker; }
    Worker const *worker() const { return m_worker; }

    std::optional<QString> gitPull();
    std::optional<QStringList> gitDiff(QString const &commit);
    std::optional<QStringList> gitMerge();

    bool gitFsck();

    QString gitLastCommit(QString fileName);
    QStringList gitShowReason(QString branchName);
    static QString gitBlob(QString fileName);
    QString gitCommitForBlob(QString blob);
    bool gitIsFileTracked(QString file2name);
};

#endif // GIT_CLIENT_H_INCLUDED