#include "exchange_plan.hpp"

#include <cstdlib>
#include <iostream>
#include <map>
#include <vector>

int main(int argc, char **argv) {
  if (argc < 2 || argc > 3) {
    std::cerr << "usage: fanout_groups SENDER [COUNT]\n";
    return 2;
  }
  const unsigned sender = std::strtoul(argv[1], nullptr, 0);
  const unsigned count = argc == 3 ? std::strtoul(argv[2], nullptr, 0) : 3;
  std::map<xcom::PlanRow, std::vector<unsigned>> groups;
  for (unsigned receiver = 0; receiver < 1472; ++receiver) {
    if (receiver != sender) {
      groups[xcom::assemble(sender, receiver, count).sender].push_back(receiver);
    }
  }
  for (const auto &[plan, receivers] : groups) {
    if (receivers.size() < 2) {
      continue;
    }
    std::cout << "delay=0x" << std::hex << plan[1] << " send=0x" << plan[2]
              << std::dec << " receivers=";
    for (unsigned receiver : receivers) {
      std::cout << receiver << ',';
    }
    std::cout << '\n';
  }
}
