package handlers

import (
	"context"
	"sync"

	"leadb2b.org/internal/api"
)

const sociosEnrichWorkers = 6

func (h *Handler) sociosCountsForItems(ctx context.Context, items []api.EstabelecimentoOut) map[string]int {
	unique := make(map[string]struct{})
	for _, item := range items {
		if b := item.CNPJBasico; b != "" {
			unique[b] = struct{}{}
		}
	}
	if len(unique) == 0 {
		return nil
	}

	type result struct {
		basico string
		count  int
	}

	jobs := make(chan string, len(unique))
	results := make(chan result, len(unique))
	var wg sync.WaitGroup

	worker := func() {
		defer wg.Done()
		for basico := range jobs {
			count, err := h.leads.SociosCount(ctx, basico)
			if err != nil || count <= 0 {
				continue
			}
			results <- result{basico: basico, count: count}
		}
	}

	workers := sociosEnrichWorkers
	if workers > len(unique) {
		workers = len(unique)
	}
	wg.Add(workers)
	for i := 0; i < workers; i++ {
		go worker()
	}
	for basico := range unique {
		jobs <- basico
	}
	close(jobs)
	wg.Wait()
	close(results)

	out := make(map[string]int, len(unique))
	for r := range results {
		out[r.basico] = r.count
	}
	return out
}
