/*
 * Copyright 2009- ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation
 * nor does it submit to any jurisdiction.
 */

#ifndef ecflow_viewer_TextFilterWidget_HPP
#define ecflow_viewer_TextFilterWidget_HPP

#include <QCompleter>
#include <QToolButton>
#include <QWidget>

#include "TextFilterHandler.hpp"
#include "ui_TextFilterWidget.h"

class TextFilterCompleterModel;
class VProperty;

class TextFilterWidget : public QWidget, private Ui::TextFilterWidget {
    Q_OBJECT

public:
    explicit TextFilterWidget(QWidget* parent = nullptr);
    ~TextFilterWidget() override = default;

    enum FilterStatus { EditStatus, FoundStatus, NotFoundStatus };
    void setStatus(FilterStatus, bool force = false);

    void setEditFocus();
    void buildMenu(QToolButton* tb);
    void setExternalButtons(QToolButton* statusTb, QToolButton* optionTb);
    void setEnabledExternalButtons(bool);
    void setNumberOfLines(int);
    bool needNumberOfLines() const;
    QString filterText() const;
    bool isActive() const;
    bool isCaseSensitive() const;
    bool isMatched() const;
    void closeIt();

public Q_SLOTS:
    void slotFilterEditor();
    void on_le__textChanged();
    void on_le__returnPressed();
    void on_closeTb__clicked();
    void on_matchCb__currentIndexChanged(int);
    void on_caseCb__stateChanged(int);
    void slotOptionTb();
    void slotStatusTb(bool);

Q_SIGNALS:
    void runRequested(QString, bool, bool);
    void clearRequested();
    void closeRequested();
    void hideRequested();
    void statusChanged(FilterStatus);

protected:
    void paintEvent(QPaintEvent*) override;
    void showEvent(QShowEvent*) override;

private:
    void init(const TextFilterItem& item);
    void runIt();
    void refreshCompleter();
    void addCurrentToLatest();
    bool isCurrentSaved() const;
    void adjustToolTip();
    void addMenuSection(QMenu* menu, const std::vector<TextFilterItem>& items, QString title, QString data);

    FilterStatus status_{EditStatus};
    QBrush oriBrush_;
    QBrush redBrush_;
    QBrush greenBrush_;
    QCompleter* completer_;
    TextFilterCompleterModel* completerModel_;
    QToolButton* statusTb_{nullptr};
    QToolButton* optionTb_{nullptr};
    VProperty* showLineNumProp_{nullptr};
};

#endif /* ecflow_viewer_TextFilterWidget_HPP */
