#include "QuestRequirement.h"

#include <Fenster.h>

#include "Quest.h"

QuestRequirement::QuestRequirement()
    : ReferenceCounter()
{}

void QuestRequirement::api(Framework::StreamReader* message,
    Framework::XML::Element* zParent,
    QuestStorage* zStorage)
{}

void QuestRequirement::setRequirementId(Framework::Text id)
{
    this->id = id;
}

const Framework::Text& QuestRequirement::getRequirementId() const
{
    return id;
}

void QuestRequirement::setDescription(Framework::Text description)
{
    this->description = description;
}

const Framework::Text& QuestRequirement::getDescription() const
{
    return description;
}

QuestRequirementOpenDialog::QuestRequirementOpenDialog()
    : QuestRequirement()
{}

void QuestRequirementOpenDialog::processEvent(
    QuestEvent* zEvent, QuestStorage* zStorage)
{
    QuestRequirementStorage* zRequirementStorage
        = zStorage->zStorage(getRequirementId());
    QuestEventOpenDialog* event = dynamic_cast<QuestEventOpenDialog*>(zEvent);
    if (event)
    {
        if (event->getDialogId() == dialogId)
        {
            zRequirementStorage->setFullfilled(true);
        }
    }
}

void QuestRequirementOpenDialog::addRequirementUIML(QuestStorage* zStorage,
    Framework::XML::Element* zParent,
    Framework::Text onClickPrefix)
{
    Framework::XML::Element* container = new Framework::XML::Element(
        "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
    container->setAttribute("style",
        Framework::Text() += (Framework::Fenster::Style::Sichtbar
                              | Framework::Fenster::Style::Erlaubt));
    container->setAttribute(
        "id", Framework::Text("requirement_") += getRequirementId());
    // TODO: add icon of dialog
    auto text
        = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
    text->setAttribute("id",
        Framework::Text("requirement_description_") += getRequirementId());
    text->setText(description);
    container->addChild(text);
    auto status = new Framework::XML::Element(
        "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
    status->setAttribute("align-top", text->getAttributeValue("id"));
    status->setAttribute("align-x", text->getAttributeValue("id"));
    if (zStorage->zStorage(getRequirementId())->isFullfilled())
    {
        status->setText("Completed");
        status->setAttribute("text-color", "0xFF00FF00");
    }
    else
    {
        status->setText("Not completed");
        status->setAttribute("text-color", "0xFFFF0000");
    }
    container->addChild(status);
    zParent->addChild(container);
}

void QuestRequirementOpenDialog::setDialogId(Framework::Text dialogId)
{
    this->dialogId = dialogId;
}

const Framework::Text& QuestRequirementOpenDialog::getDialogId() const
{
    return dialogId;
}

QuestRequirementOpenDialogType::QuestRequirementOpenDialogType()
    : QuestRequirementFactoryBase()
{}

QuestRequirementOpenDialog* QuestRequirementOpenDialogType::createValue(
    Framework::JSON::JSONObject* zJson) const
{
    return new QuestRequirementOpenDialog();
}

QuestRequirementOpenDialog* QuestRequirementOpenDialogType::fromJson(
    Framework::JSON::JSONObject* zJson) const
{
    QuestRequirementOpenDialog* result
        = QuestRequirementFactoryBase::fromJson(zJson);
    result->setDialogId(zJson->zValue("dialogId")->asString()->getString());
    return result;
}

Framework::JSON::JSONObject* QuestRequirementOpenDialogType::toJsonObject(
    QuestRequirementOpenDialog* zObject) const
{
    Framework::JSON::JSONObject* result
        = QuestRequirementFactoryBase::toJsonObject(zObject);
    result->addValue(
        "dialogId", new Framework::JSON::JSONString(zObject->dialogId));
    return result;
}

JSONObjectValidationBuilder* QuestRequirementOpenDialogType::addToValidator(
    JSONObjectValidationBuilder* builder) const
{
    return QuestRequirementFactoryBase::addToValidator(
        builder->withRequiredString("dialogId")->finishString());
}

const char* QuestRequirementOpenDialogType::getTypeToken() const
{
    return "open_dialog";
}