/****************************************************************************
**
** Copyright (C) 2013 BlackBerry Limited. All rights reserved.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qppsattribute_p.h"
#include "qppsattributeprivate_p.h"

#include <QDebug>
#include <QVariant>

QT_BEGIN_NAMESPACE

///////////////////////////
//
// QPpsAttributePrivate
//
///////////////////////////

QPpsAttributePrivate::QPpsAttributePrivate() : type(QPpsAttribute::None)
{
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(int value, QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Number;
    attribute.d->data = value;
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(long long value, QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Number;
    attribute.d->data = value;
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(double value, QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Number;
    attribute.d->data = value;
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(bool value, QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Bool;
    attribute.d->data = value;
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(const QString &value,
                                                       QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::String;
    attribute.d->data = value;
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(const QPpsAttributeList &value,
                                                       QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Array;
    attribute.d->data = QVariant::fromValue(value);
    attribute.d->flags = flags;
    return attribute;
}

QPpsAttribute QPpsAttributePrivate::createPpsAttribute(const QPpsAttributeMap &value,
                                                       QPpsAttribute::Flags flags)
{
    QPpsAttribute attribute;
    attribute.d->type = QPpsAttribute::Object;
    attribute.d->data = QVariant::fromValue(value);
    attribute.d->flags = flags;
    return attribute;
}

///////////////////////////
//
// QPpsAttribute
//
///////////////////////////

QPpsAttribute::QPpsAttribute() : d(new QPpsAttributePrivate())
{
}

QPpsAttribute::~QPpsAttribute()
{
}

QPpsAttribute::QPpsAttribute(const QPpsAttribute &other) : d(other.d)
{
}

QPpsAttribute &QPpsAttribute::operator=(const QPpsAttribute &other)
{
    d = other.d;
    return *this;
}

QPpsAttribute::QPpsAttribute(QPpsAttribute &&other) : d(other.d)
{
    other.d->type = QPpsAttribute::None;
}

QPpsAttribute &QPpsAttribute::operator=(QPpsAttribute &&other)
{
    qSwap(d, other.d);
    return *this;
}

bool QPpsAttribute::operator==(const QPpsAttribute &other) const
{
    if (type() != other.type())
        return false;
    if (flags() != other.flags())
        return false;

    switch (type()) {
    case QPpsAttribute::Number:
    case QPpsAttribute::Bool:
    case QPpsAttribute::String:
        // QVariant can compare double, int, longlong, bool, and QString for us.
        return d->data == other.d->data;
    case QPpsAttribute::Array:
        // QVariant can't compare custom types (like QPpsAttributeList), always returning false.
        // So we pull the lists out manually and compare them.
        return toList() == other.toList();
    case QPpsAttribute::Object:
        // QVariant can't compare custom types (like QPpsAttributeMap), always returning false.
        // So we pull the maps out manually and compare them.
        return toMap() == other.toMap();
    case QPpsAttribute::None:
        // Both are "None" type, so the actual content doesn't matter.
        return true;
    }
    return d->data == other.d->data;
}

bool QPpsAttribute::isValid() const
{
    return d->type != QPpsAttribute::None;
}

QPpsAttribute::Type QPpsAttribute::type() const
{
    return d->type;
}

bool QPpsAttribute::isNumber() const
{
    return type() == QPpsAttribute::Number;
}

bool QPpsAttribute::isBool() const
{
    return type() == QPpsAttribute::Bool;
}

bool QPpsAttribute::isString() const
{
    return type() == QPpsAttribute::String;
}

bool QPpsAttribute::isArray() const
{
    return type() == QPpsAttribute::Array;
}

bool QPpsAttribute::isObject() const
{
    return type() == QPpsAttribute::Object;
}

double QPpsAttribute::toDouble() const
{
    return d->data.toDouble();
}

qlonglong QPpsAttribute::toLongLong() const
{
    return d->data.toLongLong();
}

int QPpsAttribute::toInt() const
{
    return d->data.toInt();
}

bool QPpsAttribute::toBool() const
{
    return d->data.toBool();
}

QString QPpsAttribute::toString() const
{
    return d->data.toString();
}

QPpsAttributeList QPpsAttribute::toList() const
{
    return d->data.value< QPpsAttributeList >();
}

QPpsAttributeMap QPpsAttribute::toMap() const
{
    return d->data.value< QPpsAttributeMap >();
}

QPpsAttribute::Flags QPpsAttribute::flags() const
{
    return d->flags;
}

QVariant QPpsAttribute::toVariant() const
{
    return d->data;
}

QDebug operator<<(QDebug dbg, const QPpsAttribute &attribute)
{
    QDebugStateSaver saver(dbg);
    dbg.nospace() << "QPpsAttribute(";

    switch (attribute.type()) {
    case QPpsAttribute::Number:
        switch (attribute.toVariant().type()) {
        case QVariant::Int:
            dbg << "Number, " << attribute.flags() << ", " << attribute.toInt();
            break;
        case QVariant::LongLong:
            dbg << "Number, " << attribute.flags() << ", " << attribute.toLongLong();
            break;
        default:
            dbg << "Number, " << attribute.flags() << ", " << attribute.toDouble();
            break;
        }
        break;
    case QPpsAttribute::Bool:
        dbg << "Bool, " << attribute.flags() << ", " << attribute.toBool();
        break;
    case QPpsAttribute::String:
        dbg << "String, " << attribute.flags() << ", " << attribute.toString();
        break;
    case QPpsAttribute::Array:
        dbg << "Array, " << attribute.flags() << ", " << attribute.toList();
        break;
    case QPpsAttribute::Object:
        dbg << "Object, " << attribute.flags() << ", " << attribute.toMap();
        break;
    case QPpsAttribute::None:
        dbg << "None";
        break;
    }

    dbg << ')';

    return dbg;
}

QT_END_NAMESPACE
