#pragma once

#include "nlohmann/json.hpp"
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include "sc2api/sc2_typeenums.h"


struct BuildDescription
{
    sc2::UNIT_TYPEID producer_type;
    sc2::UNIT_TYPEID result_type;
    sc2::AbilityID ability_used;
    float time;

    std::vector<sc2::UNIT_TYPEID> buildings_needed;
    std::vector<sc2::UNIT_TYPEID> addons_needed;
};

class TechTreeImproved
{
    std::vector<BuildDescription> data;
    std::map<sc2::UNIT_TYPEID, std::vector<BuildDescription>> producer_to_data;
    std::map<sc2::UNIT_TYPEID, std::vector<BuildDescription>> result_to_data;

    void parse_unit(nlohmann::json::iterator it);
public:
    TechTreeImproved();
    void LoadData();
    // Given a unit, how can we build it?
    const std::vector<BuildDescription> & HowToBuild(sc2::UnitTypeID unit) const;
};