/***
   This file is part of fly-ocr.

   Copyright (C) 2016-2020 Sandro Mani <manisandro@gmail.com>
   Copyright (C) 2021 LLC "RusBITech-Astra" (https://astralinux.ru)

    Based on gImageReader source code by Sandro Mani under the GNU
    General Public License (GPL) version 3 or later

   Foobar is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   Foobar is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with fly-ocr. If not, see <https://www.gnu.org/licenses/>.
***/

#ifndef OUTPUTEDITORTEXT_H
#define OUTPUTEDITORTEXT_H

#include <QtSpell.hpp>

#include "configdialog.h"
#include "mainwindow.h"
#include "outputeditor.h"
#include "outputeditortext_ui.h"

class OutputEditorText : public OutputEditor
{
    Q_OBJECT
public:
    class TextBatchProcessor : public BatchProcessor
    {
    public:
        TextBatchProcessor(bool prependPage) : m_prependPage(prependPage) {}
        QString fileSuffix() const override { return QString(".txt"); }
        void appendOutput(QIODevice* dev, OcrEngine* engine, const PageInfo& pageInfo, bool firstArea) const override;
    private:
        bool m_prependPage = false;
    };

    OutputEditorText(QWidget* parent = nullptr);
    ~OutputEditorText();

    void read(int pageNumber, const SourceDocumentPage* page) override;
    bool isModified() const override;
    void commit() override;
    void clear() override;
    void setLanguage(const QString& code) override;

    BatchProcessor* createBatchProcessor(const QMap<QString, QVariant>& options) const override { return new TextBatchProcessor(options["prependPage"].toBool()); }

private slots:
    void filterBuffer();
    void findReplace(const QString& searchstr, const QString& replacestr, bool matchCase, bool backwards, bool replace);
    void replaceAll(const QString& searchstr, const QString& replacestr, bool matchCase);
    void applySubstitutions(const QMap<QString, QString>& substitutions, bool matchCase);
    void setFont();

private:
    OutputEditorTextUi m_ui;
    QtSpell::TextEditChecker m_spell;
    int m_pageNumber = -1;
};

#endif // OUTPUTEDITORTEXT_H
