// Copyright (C) 2018 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default

#include "qlottieimage_p.h"

#include <QDir>
#include <QFileInfo>
#include <QJsonObject>
#include <QString>

#include <QtLottie/private/qlottieconstants_p.h>

QT_BEGIN_NAMESPACE

using namespace Qt::Literals::StringLiterals;

QLottieImage::QLottieImage(const QLottieImage &other)
    : QLottieBase(other)
{
    m_url = other.m_url;
    m_size = other.m_size;
    m_image = other.m_image;
}

QLottieImage::QLottieImage(QLottieBase *parent)
{
    setParent(parent);
}

QLottieBase *QLottieImage::clone() const
{
    return new QLottieImage(*this);
}

int QLottieImage::construct(const QJsonObject &definition)
{
    QLottieBase::parse(definition);
    if (m_hidden)
        return 0;

    qCDebug(lcLottieQtLottieParser) << "QLottieImage::parse():" << m_name;

    QJsonObject asset = definition.value("asset"_L1).toObject();
    if (!checkRequiredKeys(asset, "Image"_L1, { "p"_L1, "w"_L1, "h"_L1 }, m_name))
        return -1;

    QString assetString = asset.value("p"_L1).toString();

    if (assetString.startsWith("data:image"_L1)) {
        QStringList assetsDataStringList = assetString.split(","_L1);
        if (assetsDataStringList.size() > 1) {
            QByteArray assetData = QByteArray::fromBase64(assetsDataStringList[1].toLatin1());
            m_image.loadFromData(assetData);
        }
        if (m_image.isNull()) {
            qCWarning(lcLottieQtLottieParser) << "Unable to load embedded image asset"
                                              << asset.value("id"_L1).toString();
        }
    } else {
        QFileInfo info(asset.value("fileSource"_L1).toString());
        QString urlPath = info.path() + QLatin1Char('/') + asset.value("u"_L1).toString()
                + QLatin1Char('/') + assetString;
        m_url = QUrl(urlPath);
        m_url.setScheme("file"_L1);
        QString path = m_url.toLocalFile();
        m_image.load(path);
        if (m_image.isNull())
            qCWarning(lcLottieQtLottieParser) << "Unable to load file" << path;
    }

    const qreal width = asset.value("w"_L1).toDouble();
    const qreal height = asset.value("h"_L1).toDouble();
    m_size = QSizeF(width, height);

    return 0;
}

void QLottieImage::render(QLottieRenderer &renderer) const
{
    renderer.render(*this);
}

QT_END_NAMESPACE
