#include "birthsignbindings.hpp"

#include <components/esm3/loadbsgn.hpp>
#include <components/lua/luastate.hpp>
#include <components/misc/resourcehelpers.hpp>
#include <components/resource/resourcesystem.hpp>

#include "../mwbase/environment.hpp"

#include "idcollectionbindings.hpp"
#include "types/types.hpp"

namespace sol
{
    template <>
    struct is_automagical<ESM::BirthSign> : std::false_type
    {
    };
}

namespace MWLua
{
    sol::table initBirthSignRecordBindings(const Context& context)
    {
        sol::state_view lua = context.sol();
        sol::table birthSigns(lua, sol::create);
        addRecordFunctionBinding<ESM::BirthSign>(birthSigns, context);

        auto signT = lua.new_usertype<ESM::BirthSign>("ESM3_BirthSign");
        signT[sol::meta_function::to_string] = [](const ESM::BirthSign& rec) -> std::string {
            return "ESM3_BirthSign[" + rec.mId.toDebugString() + "]";
        };
        signT["id"] = sol::readonly_property([](const ESM::BirthSign& rec) { return rec.mId.serializeText(); });
        signT["name"] = sol::readonly_property([](const ESM::BirthSign& rec) -> std::string_view { return rec.mName; });
        signT["description"]
            = sol::readonly_property([](const ESM::BirthSign& rec) -> std::string_view { return rec.mDescription; });
        auto vfs = MWBase::Environment::get().getResourceSystem()->getVFS();
        signT["texture"] = sol::readonly_property([vfs](const ESM::BirthSign& rec) -> std::string {
            return Misc::ResourceHelpers::correctTexturePath(rec.mTexture, vfs);
        });
        signT["spells"] = sol::readonly_property([lua](const ESM::BirthSign& rec) -> sol::table {
            return createReadOnlyRefIdTable(lua, rec.mPowers.mList);
        });

        return LuaUtil::makeReadOnly(birthSigns);
    }
}