#include "library.h"

namespace py = pybind11;

void define_unittype(py::module & m)
{
    py::class_<UnitType>(m, "UnitType")
        .def(py::init<const sc2::UnitTypeID &, IDABot &>())
        .def(py::self == py::self)
        .def_property_readonly("unit_typeid", [](UnitType & unit_type) { return static_cast<sc2::UNIT_TYPEID>(unit_type.getAPIUnitType()); })
        .def_property_readonly("name", &UnitType::getName)
        .def_property_readonly("race", &UnitType::getRace)
        .def_property_readonly("movement_speed", &UnitType::getMovementSpeed)
        .def_property_readonly("sight_range", &UnitType::getSightRange)
        .def_property_readonly("required_structure", &UnitType::getRequiredStructure)
        .def_property_readonly("is_valid", &UnitType::isValid)
        .def_property_readonly("is_building", &UnitType::isBuilding)
        .def_property_readonly("is_combat_unit", &UnitType::isCombatUnit, "The unit is not any of the following: worker, supply provider, building, larva, egg")
        .def_property_readonly("is_supply_provider", &UnitType::isSupplyProvider)
        .def_property_readonly("is_resource_depot", &UnitType::isResourceDepot)
        .def_property_readonly("is_refinery", &UnitType::isRefinery)
        .def_property_readonly("is_detector", &UnitType::isDetector)
        .def_property_readonly("is_geyser", &UnitType::isGeyser)
        .def_property_readonly("is_mineral", &UnitType::isMineral)
        .def_property_readonly("is_worker", &UnitType::isWorker)
        .def_property_readonly("is_morphed_building", &UnitType::isMorphedBuilding)
        // Not implemented in CommandCenter
        //.def_property_readonly("can_attack", &UnitType::canAttack)
        //.def_property_readonly("can_Move", &UnitType::canMove)
        .def_property_readonly("is_addon", &UnitType::isAddon)
        .def_property_readonly("attack_range", &UnitType::getAttackRange)
        .def_property_readonly("tile_width", &UnitType::tileWidth)
        .def_property_readonly("tile_height", &UnitType::tileHeight)
        .def_property_readonly("supply_provided", &UnitType::supplyProvided)
        .def_property_readonly("supply_required", &UnitType::supplyRequired)
        .def_property_readonly("mineral_price", &UnitType::mineralPrice)
        .def_property_readonly("gas_price", &UnitType::gasPrice)
        .def_property_readonly("is_overlord", &UnitType::isOverlord)
        .def_property_readonly("is_larva", &UnitType::isLarva)
        .def_property_readonly("is_egg", &UnitType::isEgg)
        .def_property_readonly("is_queen", &UnitType::isQueen)
        .def_property_readonly("is_tank", &UnitType::isTank)
        .def("__hash__", [](const UnitType & unit_type) { return std::hash<CCUnitID>{}(unit_type.getAPIUnitType()); })
        .def(py::self == py::self)
        .def("__repr__", [](const UnitType & unit_type) { return "<UnitType: '" + unit_type.getName() + "'>"; });

        // Not implemented in CommandCenter
        //.def("whatBuilds", &UnitType::whatBuilds);
}