#include "mapitem.h"

#include "linkablemapobj.h"
#include "ornamentedobj.h"

#include <QDebug>

extern FlagRowMaster *systemFlagsMaster;

MapItem::MapItem(TreeItem *parent)
    : TreeItem(parent)
{
    // qDebug() << "Constr. MapItem(" << parent << ")";
    init();
}

void MapItem::init()
{
    mo = NULL;
    posMode = Unused;
    hideLinkUnselected = false;
}

void MapItem::appendChild(TreeItem *item)
{
    TreeItem::appendChild(item);

    // FIXME-4 maybe access parent in MapObjs directly via treeItem
    // and remove this here...

    // If lmo exists, also set parObj there
    LinkableMapObj *lmo = getLMO();
    if (lmo) {
        LinkableMapObj *itemLMO = ((MapItem *)item)->getLMO();
        if (itemLMO)
            itemLMO->setParObj(lmo);
    }
}

void MapItem::setRelPos(const QPointF &p)
{
    posMode = Relative;
    pos = p;
    LinkableMapObj *lmo = getLMO();
    if (lmo) {
        ((OrnamentedObj *)lmo)->setUseRelPos(true);
        ((OrnamentedObj *)lmo)->move2RelPos(p);
    }
}

void MapItem::setAbsPos(const QPointF &p)
{
    posMode = Absolute;
    pos = p;
    if (mo)
        mo->move(p);
}

void MapItem::setPositionMode(PositionMode mode) { posMode = mode; }

MapItem::PositionMode MapItem::getPositionMode() { return posMode; }

void MapItem::setHideLinkUnselected(bool b)
{
    hideLinkUnselected = b;
    LinkableMapObj *lmo = getLMO();
    if (lmo) {
        // lmo->setHideLinkUnselected();
        lmo->setVisibility(lmo->isVisibleObj());
        lmo->updateLinkGeometry();
    }
}

bool MapItem::getHideLinkUnselected() { return hideLinkUnselected; }

QString MapItem::getMapAttr()
{
    QString s;
    LinkableMapObj *lmo = getLMO();

    if (parentItem == rootItem)
        posMode = Absolute;
    else {
        if (type == TreeItem::Image || depth() == 1 || lmo->getUseRelPos())
            posMode = Relative; // FiXME-2 shouldn't this be replaced by relPos?
        else
            posMode = Unused;
    }
    switch (posMode) {
    case Relative:
        if (lmo)
            pos = lmo->getRelPos();
        s = attribut("relPosX", QString().setNum(pos.x())) +
            attribut("relPosY", QString().setNum(pos.y()));
        break;
    case Absolute:
        if (mo)
            pos = mo->getAbsPos();
        s = attribut("absPosX", QString().setNum(pos.x())) +
            attribut("absPosY", QString().setNum(pos.y()));
        break;
    default:
        break;
    }
    if (hideLinkUnselected)
        s += attribut("hideLink", "true");

    // Rotation angle
    MapObj *mo = getMO();
    if (mo)
        angle = mo->getRotation();
    if (angle != 0)
        s += attribut("rotation", QString().setNum(angle));

    return s;
}

QRectF MapItem::getBBoxURLFlag()
{
    QString s = "system-url";
    QStringList list = systemFlags.activeFlagNames().filter(s);
    if (list.count() > 1) {
        qWarning() << "MapItem::getBBoxURLFlag found more than one system-url*";
        return QRectF();
    }

    Flag *f = systemFlagsMaster->findFlagByName(s);
    if (f) {
        QUuid u = f->getUuid();
        LinkableMapObj *lmo = getLMO();
        if (lmo)
            return ((OrnamentedObj *)lmo)->getBBoxSystemFlagByUid(u);
    }
    return QRectF();
}

void MapItem::setRotation(const qreal &a)
{
    angle = a;
    MapObj *mo = getMO();
    if (mo)
        mo->setRotation(a);
}

MapObj *MapItem::getMO() { return mo; }

LinkableMapObj *MapItem::getLMO()
{
    if (isBranchLikeType() || type == Image)
        return (LinkableMapObj *)mo;
    else
        return NULL;
}

void MapItem::initLMO()
{
    LinkableMapObj *lmo = getLMO();
    if (!lmo)
        return;
    switch (posMode) {
    case Relative:
        lmo->setRelPos(pos);
        break;
    case Absolute:
        lmo->move(pos);
        break;
    default:
        break;
    }
}
