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

#include <pw/scene/scene.hpp>
#include <pw/scene/entity.hpp>


#include <pw/core/serialize.hpp>

#include <iostream>

using pw::scene;
using pw::entity;


struct test {
    int val = 0;
    test(int v) : val(v) {}
};


void test_stack()
{
    pw::debug::d() << __PRETTY_FUNCTION__;


    auto s = scene();
    auto e = entity{s};

    auto t = e.add_component<test>(112);

    e.remove_component<test>();

    std::cout << t.val << std::endl;

    auto e2 = entity{s};
    auto e3 = entity{s};

    e.add_child(e2);
    e.add_child(e3);

    e2.add_component<pw::transform>();
    e3.add_component<pw::transform>();

    auto e22 = entity{s};
    e22.add_component<pw::transform>().set_scale(.5,.5,.5);
    e2.add_child(e22);

    e2.get_component<pw::transform>().set_translation(10,20,40);

    std::cout << e.child_count() << std::endl;

    s.update_transforms();

}

void test_heap()
{

    pw::debug::d() << __PRETTY_FUNCTION__;

    auto s = std::make_unique<scene>();

    auto e = std::make_unique<entity>(*s);

    auto e2 = std::make_unique<entity>(*s);

    e->add_child(*e2);

    pw::debug::d() << e->child_count();


    auto t = e->add_component<test>(112);

    std::cout << t.val << std::endl;

}


int main()
{
    test_stack();
    test_heap();

}
