#pragma once

#include <cstdint>
#include <string>

#include "adapters/unity/bindings/UnityTypes.h"
#include "adapters/il2cpp/Il2CppCollections.h"
#include "adapters/unity/bindings/UnityApi.h"
#include "features/items/contracts/ItemCatalogTypes.h"

namespace ta::adapters::eft::world
{
struct UnlockDoorsRequest
{
    std::uint64_t trace_id = 0;
};

struct ItemTeleportRequest
{
    float circle_radius = 2.5f;
    float height_offset = 0.5f;

    bool include_normal_items = false;
    std::uint32_t normal_category_mask = 0;
    bool include_wishlist_items = false;
    bool include_quest_items = false;
    bool include_corpses = false;
    std::uint64_t trace_id = 0;

    [[nodiscard]] bool includes_normal_category(const ta::features::items::contracts::ItemCategory category) const noexcept
    {
        return (normal_category_mask & ta::features::items::contracts::item_category_bit(category)) != 0;
    }
};

struct WorldItemGroup
{
    ta::adapters::unity::vector3 anchor{};
    int item_count = 0;
};

struct WorldActionResult
{
    bool executed = false;
    int changed = 0;
    int moved = 0;
    int grouped = 0;
    int groups = 0;
    int skipped = 0;
    int normal_items = 0;
    int wishlist_items = 0;
    int quest_items = 0;
    int corpses = 0;
    std::string message;
};
}
