"""Panašių tendencijų grupavimas.

Du metodai:
  - greitas: RapidFuzz token_set_ratio
  - tikslesnis grupavimui: TF-IDF + kosinusas (kai jau yra DB)

Jei pridedant naują trendą randam jau esamą labai panašų – jį susiejam
trend_links lentelėje.
"""

from __future__ import annotations

from typing import Iterable, List, Sequence, Tuple

from rapidfuzz import fuzz, process

from .text_cleaner import normalize_for_dedup


def best_match(candidate: str, pool: Sequence[str],
               threshold: float = 0.86) -> Tuple[int, float] | None:
    """Grąžina (index, similarity 0..1) arba None."""
    if not candidate or not pool:
        return None
    norm_cand = normalize_for_dedup(candidate)
    norm_pool = [normalize_for_dedup(p) for p in pool]
    result = process.extractOne(norm_cand, norm_pool, scorer=fuzz.token_set_ratio)
    if result is None:
        return None
    _, score, idx = result  # rapidfuzz: (choice, score, index)
    sim = score / 100.0
    if sim >= threshold:
        return idx, sim
    return None


def find_duplicates(keywords: Iterable[str], threshold: float = 0.86,
                    ) -> List[Tuple[int, int, float]]:
    """O(n^2) panašumas mažoms imties – grąžina porų sąrašą (i, j, sim)."""
    kws = [normalize_for_dedup(k) for k in keywords]
    pairs: List[Tuple[int, int, float]] = []
    for i, a in enumerate(kws):
        for j in range(i + 1, len(kws)):
            sim = fuzz.token_set_ratio(a, kws[j]) / 100.0
            if sim >= threshold:
                pairs.append((i, j, sim))
    return pairs
