#include <rive/artboard.hpp>
#include <rive/core/binary_reader.hpp>
#include <rive/file.hpp>
#include <rive/math/circle_constant.hpp>
#include <rive/node.hpp>
#include <rive/shapes/ellipse.hpp>
#include <rive/shapes/path_composer.hpp>
#include <rive/shapes/rectangle.hpp>
#include <rive/shapes/shape.hpp>
#include "no_op_renderer.hpp"
#include <catch.hpp>
#include <cstdio>

TEST_CASE("rectangle path builds expected commands", "[path]") {
    rive::Artboard* artboard = new rive::Artboard();
    rive::Shape* shape = new rive::Shape();
    rive::Rectangle* rectangle = new rive::Rectangle();

    rectangle->x(0.0f);
    rectangle->y(0.0f);
    rectangle->width(100.0f);
    rectangle->height(200.0f);
    rectangle->cornerRadiusTL(0.0f);

    artboard->addObject(artboard);
    artboard->addObject(shape);
    artboard->addObject(rectangle);
    rectangle->parentId(1);

    REQUIRE(artboard->initialize() == rive::StatusCode::Ok);

    artboard->advance(0.0f);

    REQUIRE(rectangle->commandPath() != nullptr);

    auto path = reinterpret_cast<rive::NoOpRenderPath*>(rectangle->commandPath());

    REQUIRE(path->commands.size() == 7);
    REQUIRE(path->commands[0].command == rive::NoOpPathCommandType::Reset);
    REQUIRE(path->commands[1].command == rive::NoOpPathCommandType::MoveTo);
    REQUIRE(path->commands[2].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[3].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[4].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[5].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[6].command == rive::NoOpPathCommandType::Close);

    delete artboard;
}

TEST_CASE("rounded rectangle path builds expected commands", "[path]") {
    rive::Artboard* artboard = new rive::Artboard();
    rive::Shape* shape = new rive::Shape();
    rive::Rectangle* rectangle = new rive::Rectangle();

    rectangle->x(0.0f);
    rectangle->y(0.0f);
    rectangle->width(100.0f);
    rectangle->height(200.0f);
    rectangle->cornerRadiusTL(20.0f);
    rectangle->linkCornerRadius(true);

    artboard->addObject(artboard);
    artboard->addObject(shape);
    artboard->addObject(rectangle);
    rectangle->parentId(1);

    artboard->initialize();

    artboard->advance(0.0f);

    REQUIRE(rectangle->commandPath() != nullptr);

    auto path = reinterpret_cast<rive::NoOpRenderPath*>(rectangle->commandPath());

    // reset
    // moveTo
    // cubic - for 1st corner

    // lineTo, cubicTo for 2nd corner
    // lineTo, cubicTo for 3rd corner
    // lineTo, cubicTo for 4th corner

    // close

    REQUIRE(path->commands.size() == 11);

    // Init
    REQUIRE(path->commands[0].command == rive::NoOpPathCommandType::Reset);
    REQUIRE(path->commands[1].command == rive::NoOpPathCommandType::MoveTo);

    // 1st
    REQUIRE(path->commands[2].command == rive::NoOpPathCommandType::CubicTo);

    // 2nd
    REQUIRE(path->commands[3].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[4].command == rive::NoOpPathCommandType::CubicTo);

    // 3rd
    REQUIRE(path->commands[5].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[6].command == rive::NoOpPathCommandType::CubicTo);

    // 4th
    REQUIRE(path->commands[7].command == rive::NoOpPathCommandType::LineTo);
    REQUIRE(path->commands[8].command == rive::NoOpPathCommandType::CubicTo);

    REQUIRE(path->commands[9].command == rive::NoOpPathCommandType::LineTo);

    REQUIRE(path->commands[10].command == rive::NoOpPathCommandType::Close);

    delete artboard;
}

TEST_CASE("ellipse path builds expected commands", "[path]") {
    rive::Artboard* artboard = new rive::Artboard();
    rive::Ellipse* ellipse = new rive::Ellipse();
    rive::Shape* shape = new rive::Shape();

    ellipse->x(0.0f);
    ellipse->y(0.0f);
    ellipse->width(100.0f);
    ellipse->height(200.0f);

    artboard->addObject(artboard);
    artboard->addObject(shape);
    artboard->addObject(ellipse);
    ellipse->parentId(1);

    artboard->initialize();

    artboard->advance(0.0f);

    REQUIRE(ellipse->commandPath() != nullptr);

    auto path = reinterpret_cast<rive::NoOpRenderPath*>(ellipse->commandPath());

    // reset
    // moveTo
    // cubic - for 1st corner

    // lineTo, cubicTo for 2nd corner
    // lineTo, cubicTo for 3rd corner
    // lineTo, cubicTo for 4th corner

    // close

    REQUIRE(path->commands.size() == 7);

    // Init
    REQUIRE(path->commands[0].command == rive::NoOpPathCommandType::Reset);
    REQUIRE(path->commands[1].command == rive::NoOpPathCommandType::MoveTo);
    REQUIRE(path->commands[1].x == 0.0f);
    REQUIRE(path->commands[1].y == -100.0f);

    // 1st
    REQUIRE(path->commands[2].command == rive::NoOpPathCommandType::CubicTo);
    REQUIRE(path->commands[2].outX == 50.0f * rive::circleConstant);
    REQUIRE(path->commands[2].outY == -100.0f);
    REQUIRE(path->commands[2].inX == 50.0f);
    REQUIRE(path->commands[2].inY == -100.0f * rive::circleConstant);
    REQUIRE(path->commands[2].x == 50.0f);
    REQUIRE(path->commands[2].y == 0.0f);

    // 2nd
    REQUIRE(path->commands[3].command == rive::NoOpPathCommandType::CubicTo);
    REQUIRE(path->commands[3].outX == 50.0f);
    REQUIRE(path->commands[3].outY == 100.0f * rive::circleConstant);
    REQUIRE(path->commands[3].inX == 50.0f * rive::circleConstant);
    REQUIRE(path->commands[3].inY == 100.0f);
    REQUIRE(path->commands[3].x == 0.0f);
    REQUIRE(path->commands[3].y == 100.0f);

    // 3rd
    REQUIRE(path->commands[4].command == rive::NoOpPathCommandType::CubicTo);
    REQUIRE(path->commands[4].outX == -50.0f * rive::circleConstant);
    REQUIRE(path->commands[4].outY == 100.0f);
    REQUIRE(path->commands[4].inX == -50.0f);
    REQUIRE(path->commands[4].inY == 100.0f * rive::circleConstant);
    REQUIRE(path->commands[4].x == -50.0f);
    REQUIRE(path->commands[4].y == 0.0f);

    // 4th
    REQUIRE(path->commands[5].command == rive::NoOpPathCommandType::CubicTo);
    REQUIRE(path->commands[5].outX == -50.0f);
    REQUIRE(path->commands[5].outY == -100.0f * rive::circleConstant);
    REQUIRE(path->commands[5].inX == -50.0f * rive::circleConstant);
    REQUIRE(path->commands[5].inY == -100.0f);
    REQUIRE(path->commands[5].x == 0.0f);
    REQUIRE(path->commands[5].y == -100.0f);

    REQUIRE(path->commands[6].command == rive::NoOpPathCommandType::Close);

    delete artboard;
}