#ifndef OVERVIEWWIDGET_H
#define OVERVIEWWIDGET_H

#include "CutterDockWidget.h"

class MainWindow;
class OverviewView;
class GraphWidget;

class OverviewWidget : public CutterDockWidget
{
    Q_OBJECT

public:
    explicit OverviewWidget(MainWindow *main);
    ~OverviewWidget();

private:
    OverviewView *graphView;
    bool isAvailable = false;
    bool userOpened = false;

    GraphWidget *targetGraphWidget;

    RefreshDeferrer *graphDataRefreshDeferrer;

    /**
     * @brief this takes care of scaling the overview when the widget is resized
     */
    void resizeEvent(QResizeEvent *event) override;

    void setIsAvailable(bool isAvailable);
    void setUserOpened(bool userOpened);
    void zoomTarget(int d);

private slots:
    void showEvent(QShowEvent *event) override;
    void closeEvent(QCloseEvent *event) override;

    /**
     * @brief update the view in the target widget when the range rect in the overview is moved
     */
    void updateTargetView();

    /**
     * @brief update the content of the graph (blocks, edges) in the contained graphView from the
     * target widget
     */
    void updateGraphData();

    /**
     * @brief update the rect to show the current view in the target widget
     */
    void updateRangeRect();

    void targetClosed();

signals:
    /**
     * @brief emit signal to update the rect
     */
    void resized();

    /**
     * @sa getIsAvailable()
     */
    void isAvailableChanged(bool isAvailable);

    /**
     * @sa getUserOpened()
     */
    void userOpenedChanged(bool userOpened);

public:
    GraphWidget *getTargetGraphWidget() { return targetGraphWidget; }
    void setTargetGraphWidget(GraphWidget *widget);

    /**
     * @brief whether this widget makes sense to be show, i.e. the menu entry should be enabled
     */
    bool getIsAvailable() const { return isAvailable; }

    /**
     * @brief whether this widget is desired to be shown in general
     *
     * Will be false when the user closed the overview explicitly.
     * Also corresponds to the checked state of the menu entry for this widget.
     */
    bool getUserOpened() const { return userOpened; }

    OverviewView *getGraphView() const { return graphView; }
    void wheelEvent(QWheelEvent *event) override;
};

#endif // OverviewWIDGET_H
