#!/usr/bin/env python3
from __future__ import annotations

import argparse
import concurrent.futures
import random
import time
from dataclasses import dataclass


@dataclass(frozen=True)
class Municipio:
    codigo_ibge: str
    nome: str
    last_nsu: int


def sincronizar_municipio(municipio: Municipio, ciclos: int) -> dict[str, object]:
    nsu = municipio.last_nsu
    eventos = []

    for _ in range(ciclos):
        time.sleep(random.uniform(0.05, 0.2))
        nsu += 1
        eventos.append(nsu)

    return {
        "codigo_ibge": municipio.codigo_ibge,
        "nome": municipio.nome,
        "last_nsu_inicial": municipio.last_nsu,
        "last_nsu_final": nsu,
        "nsus_processados": eventos,
    }


def main() -> int:
    parser = argparse.ArgumentParser(
        description="Simula processamento paralelo por municipio sem chamar a API real."
    )
    parser.add_argument("--concurrency", type=int, default=4)
    parser.add_argument("--ciclos", type=int, default=3)
    args = parser.parse_args()

    municipios = [
        Municipio("3550308", "Sao Paulo", 0),
        Municipio("3304557", "Rio de Janeiro", 0),
        Municipio("3106200", "Belo Horizonte", 10),
        Municipio("4106902", "Curitiba", 20),
        Municipio("2927408", "Salvador", 30),
    ]

    print(f"workers={args.concurrency} municipios={len(municipios)} ciclos={args.ciclos}")

    with concurrent.futures.ThreadPoolExecutor(max_workers=args.concurrency) as executor:
        futures = [
            executor.submit(sincronizar_municipio, municipio, args.ciclos)
            for municipio in municipios
        ]

        for future in concurrent.futures.as_completed(futures):
            resultado = future.result()
            print(
                "{codigo_ibge} {nome}: {last_nsu_inicial} -> {last_nsu_final} nsus={nsus_processados}".format(
                    **resultado
                )
            )

    return 0


if __name__ == "__main__":
    raise SystemExit(main())
