//
// Created by Иван Ильин on 26.01.2021.
//

#ifndef ENGINE_ANIMATION_H
#define ENGINE_ANIMATION_H

#include "../utils/Time.h"
#include "../Triangle.h"
#include "Interpolation.h"

class Animatable;

class Animation {
public:
    enum InterpolationType {
        linear,
        cos,
        bezier,
        bouncing
    };
    enum LoopOut {
        None,
        Cycle,
        Continue
    };
protected:
    double _time = 0; // normalized time (from 0 to 1)
    double _dtime = 0;
    double _timeOld = 0;

    double _endAnimationPoint = 0;
    double _startAnimationPoint = 0;
    double _duration = 0;
    bool _started = false;
    LoopOut _looped = None;
    // _p - animation progress
    double _p = 0;
    double _dp = 0;

    InterpolationType _intType = bezier;
    Point4D _bezier[2] = {Point4D{0.8, 0}, Point4D{0.2, 1}};

    // If '_waitFor' == true then we need to finish all animation before starting this one. (for example for a_wait() or a_scale())
    bool _waitFor = false;

    bool updateState();
public:
    Animation() = default;
    virtual ~Animation() = default;

    void setBezierParams(const Point4D& p1, const Point4D& p2) { _bezier[0] = p1; _bezier[1] = p2; }
    [[nodiscard]] bool waitFor() const { return _waitFor; }


    // You should override this method for your particular animation
    virtual bool update() = 0;
};

#endif //INC_3DZAVR_ANIMATION_H
