#!/usr/bin/env python3
# type: ignore
import random
from collections import defaultdict

from tqdm import tqdm

from openpilot.selfdrive.car.fw_versions import match_fw_to_car_fuzzy
from openpilot.selfdrive.car.toyota.values import FW_VERSIONS as TOYOTA_FW_VERSIONS
from openpilot.selfdrive.car.honda.values import FW_VERSIONS as HONDA_FW_VERSIONS
from openpilot.selfdrive.car.hyundai.values import FW_VERSIONS as HYUNDAI_FW_VERSIONS
from openpilot.selfdrive.car.volkswagen.values import FW_VERSIONS as VW_FW_VERSIONS


FWS = {}
FWS.update(TOYOTA_FW_VERSIONS)
FWS.update(HONDA_FW_VERSIONS)
FWS.update(HYUNDAI_FW_VERSIONS)
FWS.update(VW_FW_VERSIONS)

if __name__ == "__main__":
  total = 0
  match = 0
  wrong_match = 0
  confusions = defaultdict(set)

  for _ in tqdm(range(1000)):
    for candidate, fws in FWS.items():
      fw_dict = {}
      for (_, addr, subaddr), fw_list in fws.items():
        fw_dict[(addr, subaddr)] = [random.choice(fw_list)]

      matches = match_fw_to_car_fuzzy(fw_dict, log=False, exclude=candidate)

      total += 1
      if len(matches) == 1:
        if list(matches)[0] == candidate:
          match += 1
        else:
          confusions[candidate] |= matches
          wrong_match += 1

  print()
  for candidate, wrong_matches in sorted(confusions.items()):
    print(candidate, wrong_matches)

  print()
  print(f"Total fuzz cases: {total}")
  print(f"Correct matches:  {match}")
  print(f"Wrong matches:    {wrong_match}")