#include <pw/core/debug.hpp>
#include <pw/core/quaternion.hpp>
#include <pw/core/serialize.hpp>

auto main() -> int {

    pw::debug::d() << "pixwerx.quaternion.test\n";

    auto q0 = pw::quaternion<float>{};
    auto q1 = pw::quaternion{1.f, 2.f, 3.f, 4.f};

    pw::debug::d() << "q0 = quaternion{} -> \n" << pw::serialize::to_string(q0);
    pw::debug::d() << "q1 = quaternion{1,2,3,4} -> \n"
                   << pw::serialize::to_string(q1);

    q1 = q1.normalized();
    pw::debug::d() << "q1 = quaternion{1,2,3,4}.normalized() -> \n"
                   << pw::serialize::to_string(q1);

    auto q0_x_q1 = q0 * q1;
    pw::debug::d() << "q0 * q1 -> \n" << pw::serialize::to_string(q0_x_q1);

    auto q1_conj = q1.conjugate();
    pw::debug::d() << "q1.conjugate() -> \n"
                   << pw::serialize::to_string(q1_conj);

    auto q1_conj_nml = q1_conj.normalized();
    pw::debug::d() << "q1.conjugate().normalized() -> \n"
                   << pw::serialize::to_string(q1_conj_nml);

    auto q1_conj_inv = q1_conj.inverse();
    pw::debug::d() << "q1.conjugate().inverse() -> \n"
                   << pw::serialize::to_string(q1_conj_inv);

    pw::debug::d() << "quaternion::dot(q0,q1) -> " << q0.dot(q1);

    auto lerp_q0_q1_half = decltype(q0)::lerp(q0, q1, 0.3f);
    pw::debug::d() << "quaternion::lerp(q0,q1,0.3) -> \n"
                   << pw::serialize::to_string(lerp_q0_q1_half);

    auto slerp_q0_q1_half = decltype(q0)::slerp(q0, q1, 0.3f);
    pw::debug::d() << "quaternion::slerp(q0,q1,0.3) -> \n"
                   << pw::serialize::to_string(slerp_q0_q1_half);

    return 0;
}
