#include <rive/animation/loop.hpp>
#include <rive/animation/linear_animation.hpp>
#include <rive/animation/linear_animation_instance.hpp>
#include <catch.hpp>
#include <cstdio>

TEST_CASE("LinearAnimationInstance oneShot", "[animation]") {
    // For each of these tests, we cons up a dummy artboard/instance
    // just to make the animations happy.
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::oneShot));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());

    // play from beginning.
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // get stuck at end
    continuePlaying = linearAnimationInstance->advance(10.0);
    REQUIRE(linearAnimationInstance->time() == 5.0);
    REQUIRE(linearAnimationInstance->totalTime() == 12.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);
    REQUIRE(continuePlaying == false);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance oneShot <-", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::oneShot));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());
    linearAnimationInstance->direction(-1);
    REQUIRE(linearAnimationInstance->time() == 0.0);

    // Advancing 2 seconds backwards will keep the "animation" time at 0
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == false);
    REQUIRE(linearAnimationInstance->time() == 0.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // set time to end..
    // TODO: this also "resets" the total time. is that sensible?
    linearAnimationInstance->time(5.0);
    REQUIRE(linearAnimationInstance->totalTime() == 5.0);
    // TODO: get rid if we stop killing m_Direction
    linearAnimationInstance->direction(-1);

    // play from end to beginning
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 3.0);
    REQUIRE(linearAnimationInstance->totalTime() == 7.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // get stuck at beginning
    continuePlaying = linearAnimationInstance->advance(4.0);
    REQUIRE(continuePlaying == false);
    REQUIRE(linearAnimationInstance->time() == 0.0);
    REQUIRE(linearAnimationInstance->totalTime() == 11.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance loop ->", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::loop));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());

    // play from beginning.
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // loop around a couple of times, back to the same spot
    continuePlaying = linearAnimationInstance->advance(10.0);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 12.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);
    REQUIRE(continuePlaying == true);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance loop <-", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::loop));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());
    linearAnimationInstance->direction(-1);
    REQUIRE(linearAnimationInstance->time() == 0.0);

    // Advancing 2 seconds backwards will get the "animation" time to 3
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 3.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // play without looping past the beginning.
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 1.0);
    REQUIRE(linearAnimationInstance->totalTime() == 4.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // loop past beginning again
    continuePlaying = linearAnimationInstance->advance(4.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 8.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance loop <- work area", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 50
    linearAnimation->workStart(4);
    linearAnimation->enableWorkArea(true);
    linearAnimation->workEnd(10);
    linearAnimation->duration(100);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::loop));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());
    linearAnimationInstance->direction(-1);
    REQUIRE(linearAnimationInstance->time() == 2.0);

    // kick off, we're at the lower bound, will move to 5s.
    bool continuePlaying = linearAnimationInstance->advance(0.0);

    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 5.0);
    REQUIRE(linearAnimationInstance->totalTime() == 0.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // 2 more secs , 5s -> 3s
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 3.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // 2 more secs , 3s -> 1s, thats before start, so loops to 4s
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 4.0);
    REQUIRE(linearAnimationInstance->totalTime() == 4.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // another hit, 4->2s, thats at the start, loops to 5s
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 5.0);
    REQUIRE(linearAnimationInstance->totalTime() == 6.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance pingpong ->", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::pingPong));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());

    // play from beginning.
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    // pingpong at the end and come back to 3.
    continuePlaying = linearAnimationInstance->advance(5.0);
    REQUIRE(linearAnimationInstance->time() == 3.0);
    REQUIRE(linearAnimationInstance->totalTime() == 7.0);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->didLoop() == true);
    REQUIRE(continuePlaying == true);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance pingpong <-", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::pingPong));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());
    linearAnimationInstance->direction(-1);
    REQUIRE(linearAnimationInstance->time() == 0.0);

    // Advancing 2 seconds backwards, pongs immediately (and is acutally just
    // like playing forwards)
    bool continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == 1);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 2.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // pingpong at the end
    continuePlaying = linearAnimationInstance->advance(4.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 4.0);
    REQUIRE(linearAnimationInstance->totalTime() == 6.0);
    REQUIRE(linearAnimationInstance->didLoop() == true);

    // just a normal advance, no loop
    continuePlaying = linearAnimationInstance->advance(2.0);
    REQUIRE(continuePlaying == true);
    REQUIRE(linearAnimationInstance->direction() == -1);
    REQUIRE(linearAnimationInstance->time() == 2.0);
    REQUIRE(linearAnimationInstance->totalTime() == 8.0);
    REQUIRE(linearAnimationInstance->didLoop() == false);

    delete linearAnimationInstance;
    delete linearAnimation;
}

TEST_CASE("LinearAnimationInstance override loop", "[animation]") {
    rive::Artboard ab;
    auto abi = ab.instance();

    rive::LinearAnimation* linearAnimation = new rive::LinearAnimation();
    // duration in seconds is 5
    linearAnimation->duration(10);
    linearAnimation->fps(2);
    linearAnimation->loopValue(static_cast<int>(rive::Loop::oneShot));

    rive::LinearAnimationInstance* linearAnimationInstance =
        new rive::LinearAnimationInstance(linearAnimation, abi.get());

    // Check the loop value is same as the animation's
    REQUIRE(linearAnimationInstance->loopValue() == linearAnimation->loopValue());

    // Override the loop type
    linearAnimationInstance->loopValue(static_cast<int>(rive::Loop::pingPong));
    REQUIRE(linearAnimationInstance->loopValue() != linearAnimation->loopValue());
    REQUIRE(linearAnimationInstance->loopValue() == static_cast<int>(rive::Loop::pingPong));
    REQUIRE(linearAnimationInstance->loop() == rive::Loop::pingPong);

    delete linearAnimationInstance;
    delete linearAnimation;
}
