#include <QDebug>

#include "geometry.h"
#include "mapobj.h"
#include "misc.h"

/////////////////////////////////////////////////////////////////
// MapObj
/////////////////////////////////////////////////////////////////
MapObj::MapObj(QGraphicsItem *parent, TreeItem *ti) : QGraphicsItem(parent)
{
    // qDebug() << "Const MapObj (this,ti)=("<<this<<","<<ti<<")";
    treeItem = ti;
    init();
}

MapObj::~MapObj()
{
    // qDebug() << "Destr MapObj "<<this;
    foreach (QGraphicsItem *i, childItems())
        // Avoid tha QGraphicsScene deletes children
        i->setParentItem(NULL);
}

void MapObj::init()
{
    absPos = QPointF(0, 0);
    visible = true;
}

void MapObj::copy(MapObj *other)
{
    absPos = other->absPos;
    bbox.setX(other->bbox.x());
    bbox.setY(other->bbox.y());
    bbox.setSize(QSizeF(other->bbox.width(), other->bbox.height()));
}

void MapObj::setTreeItem(TreeItem *ti) { treeItem = ti; }

TreeItem *MapObj::getTreeItem() const { return treeItem; }

qreal MapObj::x() { return getAbsPos().x(); }

qreal MapObj::y() { return getAbsPos().y(); }

qreal MapObj::width() { return bbox.width(); }

qreal MapObj::height() { return bbox.height(); }

QPointF MapObj::getAbsPos() { return absPos; }

QString MapObj::getPos() { return qpointFToString(absPos); }

void MapObj::move(double x, double y) { MapObj::move(QPointF(x, y)); }

void MapObj::move(QPointF p)
{
    absPos = p;
    bbox.moveTo(p);
    clickPoly = QPolygonF(bbox);
}

void MapObj::moveBy(double x, double y)
{
    QPointF v(x, y);
    MapObj::move(absPos + v);
    bbox.moveTo(bbox.topLeft() + v);
    clickPoly.translate(v);
}

QRectF MapObj::boundingRect() const { return QRectF(); }

void MapObj::paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) {}

QRectF MapObj::getBBox() { return bbox; }

ConvexPolygon MapObj::getBoundingPolygon()
{
    QPolygonF p;
    p << bbox.topLeft() << bbox.topRight() << bbox.bottomRight()
      << bbox.bottomLeft();
    return p;
}

QPolygonF MapObj::getClickPoly() { return clickPoly; }

QPainterPath MapObj::getSelectionPath()
{
    qreal d = 3; // Thickness of selection "border"
    QPainterPath p;
    QRectF br = clickPoly.boundingRect();
    p.moveTo(br.topLeft() + QPointF(-d, -d));
    p.lineTo(br.topRight() + QPointF(d, -d));
    p.lineTo(br.bottomRight() + QPointF(d, d));
    p.lineTo(br.bottomLeft() + QPointF(-d, d));
    p.lineTo(br.topLeft() + QPointF(-d, -d));
    return p;
}

bool MapObj::isInClickBox(const QPointF &p)
{
    return clickPoly.containsPoint(p, Qt::OddEvenFill);
}

QSizeF MapObj::getSize() { return bbox.size(); }

void MapObj::setRotation(const qreal &a) { angle = a; }

qreal MapObj::getRotation() { return angle; }

bool MapObj::isVisibleObj() { return visible; }

void MapObj::setVisibility(bool v) { visible = v; }

void MapObj::positionBBox() {}
void MapObj::calcBBoxSize() {}
