#include <QStringList>

#include "findresultitem.h"
#include "treeitem.h"
#include "vymmodel.h"

FindResultItem::FindResultItem(const QVector<QVariant> &data,
                               FindResultItem *parent)
{
    parentItem = parent;
    itemData = data;
    orgID = -1;
    orgIndex = -1;
    orgModel = NULL;
    if (data.isEmpty())
        itemData.append(QVariant("empty"));
}

FindResultItem::~FindResultItem() { qDeleteAll(childItems); }

FindResultItem *FindResultItem::child(int number)
{
    return childItems.value(number);
}

int FindResultItem::childCount() const { return childItems.count(); }

int FindResultItem::childNumber() const
{
    if (parentItem)
        return parentItem->childItems.indexOf(
            const_cast<FindResultItem *>(this));

    return 0;
}

int FindResultItem::columnCount() const { return itemData.count(); }

QVariant FindResultItem::data(int column) const
{
    return itemData.value(column);
}

int FindResultItem::row() const
{
    if (parentItem)
        return parentItem->childItems.indexOf(
            const_cast<FindResultItem *>(this));

    return 0;
}

bool FindResultItem::insertChildren(int position, int count, int columns)
{
    if (position < 0 || position > childItems.size())
        return false;

    for (int row = 0; row < count; ++row) {
        QVector<QVariant> data(columns);
        FindResultItem *item = new FindResultItem(data, this);
        childItems.insert(position, item);
    }

    return true;
}

bool FindResultItem::insertColumns(int position, int columns)
{
    if (position < 0 || position > itemData.size())
        return false;

    for (int column = 0; column < columns; ++column)
        itemData.insert(position, QVariant());

    foreach (FindResultItem *child, childItems)
        child->insertColumns(position, columns);

    return true;
}

FindResultItem *FindResultItem::parent() { return parentItem; }

bool FindResultItem::removeChildren(int position, int count)
{
    if (position < 0 || position + count > childItems.size())
        return false;

    for (int row = 0; row < count; ++row)
        delete childItems.takeAt(position);

    return true;
}

bool FindResultItem::removeColumns(int position, int columns)
{
    if (position < 0 || position + columns > itemData.size())
        return false;

    for (int column = 0; column < columns; ++column)
        itemData.remove(position);

    foreach (FindResultItem *child, childItems)
        child->removeColumns(position, columns);

    return true;
}

bool FindResultItem::setData(int column, const QVariant &value)
{
    if (column < 0 || column >= itemData.size())
        return false;

    itemData[column] = value;
    return true;
}

void FindResultItem::setOriginal(TreeItem *ti)
{
    orgModel = ti->getModel();
    orgID = ti->getID();
}

int FindResultItem::getOriginalID() { return orgID; }

void FindResultItem::setOriginalIndex(int i) { orgIndex = i; }

int FindResultItem::getOriginalIndex() { return orgIndex; }

VymModel *FindResultItem::getOrgModel() { return orgModel; }
