#include "srcedit_storyvolume.h"
#include "keywordshighlighter.h"
#include <QComboBox>
#include <QMenu>
#include <QSpinBox>
#include <QTextStream>
#include <QVBoxLayout>

using namespace Components;
using namespace Parse::Result;
using namespace Enhancement;
using namespace Core;



StoryvolumeSourceEdit::StoryvolumeSourceEdit()
    : words_highlighter(new KeywordsHighlighter(this)),
      edit_square(new QTextEdit)
{
    words_highlighter->setDocument(this->edit_square->document());

    connect(edit_square,    &QTextEdit::textChanged,    [this](){
        emit this->dataChanged(filepath_store);
    });
}

void StoryvolumeSourceEdit::modeReset(const QString &) const{}

QList<QString> StoryvolumeSourceEdit::modes() const
{
    return QList<QString>() << "源码";
}

QString StoryvolumeSourceEdit::currentMode() const
{
    return modes()[0];
}

QString StoryvolumeSourceEdit::name() const
{
    return name_store;
}

void StoryvolumeSourceEdit::load(const QFileInfo &target_file)
{
    if(!target_file.exists())
        throw new SimpleException("参数错误：传入的文件不存在");
    if(!target_file.isFile())
        throw new SimpleException("参数错误：传入参数非文件类型");

    filepath_store = target_file.absoluteFilePath();
    QFile bin(filepath_store);
    if(!bin.open(QIODevice::ReadOnly|QIODevice::Text))
        throw new SimpleException("参数错误：指定的文件无法打开");

    QTextStream tin(&bin);
    tin.setCodec("UTF-8");
    this->edit_square->setText(tin.readAll());
}

void StoryvolumeSourceEdit::saveAs(const QString &path)
{
    if(!path.isEmpty())
        filepath_store = path;

    QFile bout(filepath_store);
    if(!bout.open(QIODevice::WriteOnly|QIODevice::Text))
        throw new SimpleException("参数错误：指定的文件无法打开");

    QTextStream tout(&bout);
    tout.setCodec("UTF-8");
    tout << this->edit_square->toPlainText();
    tout.flush();
}

QString StoryvolumeSourceEdit::relativeTargetPath(const QDir &base) const
{
    return base.relativeFilePath(filepath_store);
}

QString StoryvolumeSourceEdit::absoluteTargetPath() const
{
    return filepath_store;
}

QString StoryvolumeSourceEdit::getText() const
{
    return edit_square->toPlainText();
}

bool StoryvolumeSourceEdit::isModified() const
{
    return true;
}

void StoryvolumeSourceEdit::applySetting(const QString &name, Core::AppCore *core)
{
    this->name_store = name;

}

MakeTools::FilePresent::Features StoryvolumeSourceEdit::features()
{
    return Feature::Compile | Feature::HighLight;
}

void StoryvolumeSourceEdit::renderRepeat() const
{
    this->words_highlighter->rehighlight();
}

QList<QString> StoryvolumeSourceEdit::suffixes() const
{
    return QList<QString>() << "storyvolume";
}

std::tuple<bool, QString> StoryvolumeSourceEdit::create(const QDir &target, const QString &name, const QString &suffix)
{
    auto path = target.filePath(QString("%1.%2").arg(name, suffix));
    if(QFileInfo::exists(path))
        return std::make_tuple(false, path);

    QFile nwf(path);
    if(!nwf.open(QIODevice::WriteOnly|QIODevice::Text))
        throw new SimpleException("指定文件无法创建："+path);

    return std::make_tuple(true, target.relativeFilePath(path));
}

MakeTools::FilePresent *StoryvolumeSourceEdit::newInst() const
{
    return new StoryvolumeSourceEdit();
}

QWidget *StoryvolumeSourceEdit::widget() const
{
    return edit_square;
}

void StoryvolumeSourceEdit::jumpTo(const QList<QString> &path)
{

}

void StoryvolumeSourceEdit::contexBinding(Core::AppCore *app) { core_ins = app; }
