//TEST check publishing with intermdeiate non existent categories

#include "phapublisher.h"
#include "phrictionclient.h"
#include "ui_publishersettings.h"
#include "PluginSettings.h"
#include <QMessageBox>
#include <QFileInfo>
class UiSettings : public QWidget, public Ui::Form{};

void
PhaPublisher::publishCurrentPage(){
    Juff::Document* doc = api()->currentDocument();
    QString filename = doc->fileName();
    if (!filename.startsWith(cfgRoot)){
        QMessageBox::critical(doc, "Phabricator Publisher", "Current document located not in scope of a project", QMessageBox::Ok);
    }

    QFileInfo finfo(filename);

    QString slug;
    if (finfo.baseName()=="index"){
        slug = filename.mid(cfgRoot.length(), filename.length()-cfgRoot.length()-finfo.fileName().length()-1);
    } else {
        slug = filename.mid(cfgRoot.length(), filename.length()-cfgRoot.length()-finfo.completeSuffix().length()-1);
    }

    QString title = finfo.baseName();
    QString content;
    doc->getText(content);

    if (transport->publishDocument(slug, title, content, "")){
        QMessageBox::information(nullptr, "Phabricator publisher", "Page published successfully");
    }
}

PhaPublisher::PhaPublisher() : QObject(), JuffPlugin()
  ,uiSettings(new UiSettings()), transport(0)
{
    cfgUrl = PluginSettings::getString(this, "url", "http://localhost/");
    cfgUser = PluginSettings::getString(this, "user", "pgess");
    cfgCertificate = PluginSettings::getString(this, "certificate", "");
    cfgToken = PluginSettings::getString(this, "token", "");
    cfgRoot = PluginSettings::getString(this, "root", "~");

    uiSettings->setupUi(uiSettings);
    uiSettings->uiUrl->setText(cfgUrl);
    uiSettings->uiUser->setText(cfgUser);
    uiSettings->uiSertificate->setPlainText(cfgCertificate);
    uiSettings->uiToken->setText(cfgToken);
    uiSettings->uiRoot->setText(cfgRoot);
}

QWidget*
PhaPublisher::settingsPage() const{
    return uiSettings;
}

void PhaPublisher::applySettings(){
    if (!uiSettings) return;

    cfgUrl = uiSettings->uiUrl->text();
    cfgUser = uiSettings->uiUser->text();
    cfgCertificate = uiSettings->uiSertificate->toPlainText();
    cfgToken = uiSettings->uiToken->text();
    cfgRoot = uiSettings->uiRoot->text();

    PluginSettings::set(this, "url", cfgUrl);
    PluginSettings::set(this, "user", cfgUser);
    PluginSettings::set(this, "certificate", cfgCertificate);
    PluginSettings::set(this, "token", cfgToken);
    PluginSettings::set(this, "root", cfgRoot);

    delete transport;
    transport = new PhrictionClient(cfgUrl, cfgUser, cfgToken, cfgCertificate);
}

void
PhaPublisher::init(){
    //transport = new PhrictionClient();
}

QAction* createAction(const QString& title, const QKeySequence& key, const QObject* this_, const char* slot) {
    QAction* act = new QAction(title, 0);
    this_->connect(act, SIGNAL(triggered()), this_, slot);
    act->setShortcut(key);
    return act;
}

//	info
QString PhaPublisher::name()const {return "publisher";}
QString PhaPublisher::title() const {return "Phabricator publisher";}
QString PhaPublisher::description() const {return "Phabricator publisher";}
QString PhaPublisher::targetEngine() const{ return "all";}


Juff::ActionList
PhaPublisher::mainMenuActions(Juff::MenuID id) const {
    Juff::ActionList list;

    if ( id == Juff::MenuEdit ) {
        list << createAction(tr("publish"), QKeySequence("Ctrl+Shift+B"), this, SLOT(publishCurrentPage()));
    }
    return list;
}

PhaPublisher::~PhaPublisher(){
    delete transport;
    //delete uiSettings;
    uiSettings->deleteLater();
}

