/****************************************************************************
**
** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the Qt3D module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL3$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://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.LGPLv3 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.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 later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QT3DANIMATION_ANIMATION_FCURVE_P_H
#define QT3DANIMATION_ANIMATION_FCURVE_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists for the convenience
// of other Qt classes.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include "keyframe_p.h"
#include "functionrangefinder_p.h"

#include <Qt3DAnimation/qchannel.h>
#include <Qt3DAnimation/qchannelcomponent.h>
#include <Qt3DAnimation/qkeyframe.h>
#include <QtCore/qvector.h>

#ifndef QT_NO_DEBUG_STREAM
#include <QtCore/qdebug.h>
#endif

QT_BEGIN_NAMESPACE

namespace Qt3DAnimation {
namespace Animation {

class Q_AUTOTEST_EXPORT FCurve
{
public:
    FCurve();

    int keyframeCount() const { return m_localTimes.size(); }
    void appendKeyframe(float localTime, const Keyframe &keyframe);
    void clearKeyframes() { m_localTimes.clear(); m_keyframes.clear(); }

    const float &localTime(int index) const { return m_localTimes[index]; }
    float &localTime(int index) { return m_localTimes[index]; }
    const Keyframe &keyframe(int index) const { return m_keyframes[index]; }
    Keyframe &keyframe(int index) { return m_keyframes[index]; }

    float startTime() const;
    float endTime() const;

    float evaluateAtTime(float localTime) const;
    float evaluateAtTime(float localTime, int lowerBound) const;
    float evaluateAtTimeAsSlerp(float localTime, int lowerBound, float halfTheta, float sinHalfTheta, float reverseQ1) const;
    int lowerKeyframeBound(float localTime) const;

    void read(const QJsonObject &json);
    void setFromQChannelComponent(const QChannelComponent &qcc);

private:
    QVector<float> m_localTimes;
    QVector<Keyframe> m_keyframes;

    FunctionRangeFinder m_rangeFinder;
};

#ifndef QT_NO_DEBUG_STREAM
inline QDebug operator<<(QDebug dbg, const FCurve &fcurve)
{
    QDebugStateSaver saver(dbg);
    dbg << "Keyframe Count = " << fcurve.keyframeCount() << endl;
    for (int i = 0; i < fcurve.keyframeCount(); ++i) {
        const Keyframe &kf = fcurve.keyframe(i);
        switch (kf.interpolation) {
        case QKeyFrame::BezierInterpolation: {
            dbg << "t = " << fcurve.localTime(i)
                << ", value = " << kf.value
                << ", leftHandle = " << kf.leftControlPoint
                << ", rightHandle = " << kf.rightControlPoint
                << endl;
            break;
        }
        case QKeyFrame::ConstantInterpolation:
        case QKeyFrame::LinearInterpolation: {
            dbg << "t = " << fcurve.localTime(i)
                << ", value = " << kf.value
                << endl;
            break;
        }
        }
    }
    return dbg;
}
#endif

struct ChannelComponent
{
    QString name;
    FCurve fcurve;

    void read(const QJsonObject &json);
    void setFromQChannelComponent(const QChannelComponent &qcc);
};

#ifndef QT_NO_DEBUG_STREAM
inline QDebug operator<<(QDebug dbg, const ChannelComponent &channelComponent)
{
    QDebugStateSaver saver(dbg);
    dbg << "Channel Component Name: " << channelComponent.name << endl
        << "FCurve:" << channelComponent.fcurve << endl;
    return dbg;
}
#endif

struct Channel
{
    QString name;
    int jointIndex = -1;
    QVector<ChannelComponent> channelComponents;

    void read(const QJsonObject &json);
    void setFromQChannel(const QChannel &qch);
};

#ifndef QT_NO_DEBUG_STREAM
inline QDebug operator<<(QDebug dbg, const Channel &channel)
{
    QDebugStateSaver saver(dbg);
    dbg << "Channel Name: " << channel.name << endl
        << "Channels:" << channel.channelComponents.size() << endl;

    for (const auto &channelComponent : qAsConst(channel.channelComponents)) {
        dbg << channelComponent;
    }
    return dbg;
}
#endif

} // namespace Animation
} // namespace Qt3DAnimation

QT_END_NAMESPACE

#endif // QT3DANIMATION_ANIMATION_FCURVE_P_H
