#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;
}