#include "data_edit.h"
#include "ui_data_edit.h"
#include <QScreen>
#include <QClipboard>
#include <tinyxml2.h>
#include <vector>
#include <string>
#include "../public_def.h"

CDataEdit::CDataEdit(QWidget* parent) : QDialog(parent), ui(new Ui::CDataEdit)
{
    ui->setupUi(this);

    // setMinimumWidth(600);
    setWindowTitle(u8"源编辑");

    connect(ui->btnExit, &QPushButton::clicked, this, [&]() { close(); });
    connect(ui->btnAdd, &QPushButton::clicked, this, [&]() { import_data(); });
    connect(ui->btnCopy, &QPushButton::clicked, this, [&]() {
        QClipboard* clip = QApplication::clipboard();
        clip->setText(ui->plainTextEdit->toPlainText());
    });
}

CDataEdit::~CDataEdit()
{
    delete ui;
}

void CDataEdit::set_data(const QString& data)
{
    data_ = data;
}

void CDataEdit::set_xml_opr(CXmlOpr* xml_opr)
{
    xml_opr_ = xml_opr;
}

void CDataEdit::import_data()
{
    QString data = ui->plainTextEdit->toPlainText();
    if (data.trimmed().isEmpty()) {
        CUtil::msg(this, u8"内容为空");
        return;
    }

    if (xml_opr_ == nullptr) {
        CUtil::msg(this, u8"xml_opr无实例。");
        return;
    }

    std::vector<std::string> valid_data{};
    QStringList              list = data.trimmed().split("\n");
    for (int i = 0; i < list.size(); ++i) {
        const QString& item = list[i];
        if (item.trimmed().isEmpty()) {
            continue;
        }
        if (xml_opr_->check_same_struct(item.toStdString())) {
            CUtil::msg(this, u8"不是合法的xml语句或者与现有结构不一致。");
            return;
        }
        valid_data.push_back(item.toStdString());
    }
    auto        task_count = valid_data.size();
    std::size_t success_count{};
    if (!xml_opr_->import_newer_data(valid_data, success_count)) {
        CUtil::msg(this, u8"导入失败。");
        return;
    }
    QString info = QString(u8"需要导入 %1 条数据,成功导入 %2 条。").arg(task_count).arg(success_count);
    CUtil::msg(this, info);
}

void CDataEdit::showEvent(QShowEvent* event)
{
    show_before();
    QDialog::showEvent(event);
}

void CDataEdit::show_before()
{
    QScreen* primaryScreen = QGuiApplication::primaryScreen();
    QRect    screenGeometry = primaryScreen->geometry();
    setMinimumWidth(screenGeometry.width() * 0.8);
    if (is_import_) {
        ui->btnCopy->setVisible(false);
    } else {
        ui->btnAdd->setVisible(false);
        ui->plainTextEdit->clear();
        ui->plainTextEdit->appendPlainText(data_);
    }
}