// **************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: http://www.gnu.org/licenses/gpl.html       *
// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved        *
// **************************************************************************

#ifndef PROGRESSINDICATOR_H_INCLUDED
#define PROGRESSINDICATOR_H_INCLUDED

#include <functional>
#include <zen/error_log.h>
//#include <zen/zstring.h>
#include <wx/toplevel.h>
#include "../lib/status_handler.h"
//#include "main_dlg.h"


class CompareProgressDialog
{
public:
    CompareProgressDialog(wxTopLevelWindow& parentWindow); //CompareProgressDialog will be owned by parentWindow!

    wxWindow* getAsWindow(); //convenience! don't abuse!

    void init(const zen::Statistics& syncStat); //begin of sync: make visible, set pointer to "syncStat", initialize all status values
    void finalize(); //end of sync: hide again, clear pointer to "syncStat"

    void switchToCompareBytewise();
    void updateStatusPanelNow();

private:
    class Pimpl;
    Pimpl* const pimpl;
};


//SyncStatusHandler will internally process Window messages => disable GUI controls to avoid unexpected callbacks!

struct SyncProgressDialog
{
    enum SyncResult
    {
        RESULT_ABORTED,
        RESULT_FINISHED_WITH_ERROR,
        RESULT_FINISHED_WITH_WARNINGS,
        RESULT_FINISHED_WITH_SUCCESS
    };
    //essential to call one of these two methods in StatusUpdater derived class' destructor at the LATEST(!)
    //to prevent access to callback to updater (e.g. request abort)
    virtual void processHasFinished(SyncResult resultId, const zen::ErrorLog& log) = 0; //sync finished, still dialog may live on
    virtual void closeWindowDirectly() = 0; //don't wait for user

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

    virtual wxWindow* getAsWindow() = 0; //convenience! don't abuse!

    virtual void initNewPhase() = 0; //call after "StatusHandler::initNewPhase"
    virtual void notifyProgressChange() = 0; //throw (), required by graph!
    virtual void updateGui() = 0; //update GUI and process Window messages

    virtual std::wstring getExecWhenFinishedCommand() const = 0; //final value (after possible user modification)

    virtual void stopTimer() = 0;   //halt all internal timers!
    virtual void resumeTimer() = 0; //

protected:
    ~SyncProgressDialog() {}
};


SyncProgressDialog* createProgressDialog(zen::AbortCallback& abortCb,
                                         const std::function<void()>& notifyWindowTerminate, //note: user closing window cannot be prevented on OS X! (And neither on Windows during system shutdown!)
                                         const zen::Statistics& syncStat,
                                         wxTopLevelWindow* parentWindow, //may be nullptr
                                         bool showProgress,
                                         const wxString& jobName,
                                         const std::wstring& execWhenFinished,
                                         std::vector<std::wstring>& execFinishedHistory); //changing parameter!
//DON'T delete the pointer! it will be deleted by the user clicking "OK/Cancel"/wxWindow::Destroy() after processHasFinished() or closeWindowDirectly()


class PauseTimers
{
public:
    PauseTimers(SyncProgressDialog& ss) : ss_(ss) { ss_.stopTimer(); }
    ~PauseTimers() { ss_.resumeTimer(); }
private:
    SyncProgressDialog& ss_;
};


#endif // PROGRESSINDICATOR_H_INCLUDED