import hashlib
import re
import unicodedata

from rapidfuzz import fuzz

_TURKISH_CASE_MAP = str.maketrans({"İ": "i", "I": "ı"})

FUZZY_DUPLICATE_THRESHOLD = 90


def normalize(text: str) -> str:
    text = unicodedata.normalize("NFKC", text)
    text = text.translate(_TURKISH_CASE_MAP)
    text = text.lower()
    text = re.sub(r"[^\w\s]", "", text, flags=re.UNICODE)
    text = re.sub(r"\s+", " ", text).strip()
    return text


def text_hash(normalized_text: str) -> str:
    return hashlib.sha256(normalized_text.encode("utf-8")).hexdigest()


def find_near_duplicate(normalized_text: str, existing_normalized_texts: list[str]) -> str | None:
    for existing in existing_normalized_texts:
        if fuzz.token_sort_ratio(normalized_text, existing) >= FUZZY_DUPLICATE_THRESHOLD:
            return existing
    return None
