#include "ItemStack.h"

#include <XML.h>

#include "Globals.h"
#include "UIMLToolTip.h"

ItemStackElement::ItemStackElement()
    : Framework::UIMLElement()
{}

bool ItemStackElement::isApplicableFor(Framework::XML::Element& element)
{
    return element.getName().istGleich("itemStack");
}

Framework::Zeichnung* ItemStackElement::parseElement(
    Framework::XML::Element& element, Framework::UIMLContainer& generalFactory)
{
    ItemStackView* result = new ItemStackView(dynamic_cast<Framework::Schrift*>(
        generalFactory.getFactory().initParam.schrift->getThis()));
    updateElement(element, *result, generalFactory);
    return result;
}

bool ItemStackElement::updateElement(Framework::XML::Element& element,
    Framework::Zeichnung& z,
    Framework::UIMLContainer& generalFactory)
{
    ItemStackView* view = dynamic_cast<ItemStackView*>(&z);
    if (!view) return false;
    view->setCount(element.getAttributeValue("count"));
    auto tip = element.selectChildsByName("tip");
    if (tip.exists())
    {
        view->setToolTip((Framework::RCPointer<Framework::XML::Element>)
                             tip.getFirstElement());
    }
    int type = (int)element.getAttributeValue("type");
    const ItemType* itemType = zItemType(type);
    if (itemType)
    {
        view->setHintergrundBildZ(
            dynamic_cast<Framework::Bild*>(itemType->zIcon()->getThis()));
    }
    return true;
}

ItemStackView::ItemStackView(Framework::Schrift* schrift)
    : Framework::ZeichnungHintergrund(),
      count("")
{
    setStyle(ZeichnungHintergrund::Style::Erlaubt
             | ZeichnungHintergrund::Style::Sichtbar
             | ZeichnungHintergrund::Style::Hintergrund
             | ZeichnungHintergrund::Style::HBild
             | ZeichnungHintergrund::Style::HAlpha
             | ZeichnungHintergrund::Style::Rahmen);
    setRahmenBreite(1);
    setRahmenFarbe(0xFF52525E);
    tr.setSchriftZ(schrift);
    tr.setSchriftSize(12);
}

void ItemStackView::setCount(Framework::Text count)
{
    this->count = count;
}

void ItemStackView::setToolTip(Framework::XML::Element* zToolTipUIML)
{
    UIMLToolTip* tip = new UIMLToolTip();
    tip->setUIML(zToolTipUIML->toString());
    setToolTipZ(tip);
}

void ItemStackView::render(Framework::Bild& rObj)
{
    Framework::ZeichnungHintergrund::render(rObj);
    if (rObj.setDrawOptions(pos, gr))
    {
        if (rObj.setDrawOptions(getRahmenBreite(),
                getRahmenBreite(),
                getInnenBreite(),
                getInnenHeight()))
        {
            tr.renderText(getInnenBreite() - 5 - tr.getTextBreite(count),
                getInnenHeight() - 5 - tr.getTextHeight(count),
                count,
                rObj,
                0xFFFFFFFF);
            rObj.releaseDrawOptions();
        }
        rObj.releaseDrawOptions();
    }
}