"""Tweet metni son işlemleri: boşluk düzeni, etiket temizliği, kısaltma.

BOŞLUK DÜZENİ
-------------
Önceki hâlde her üretici `" ".join(text.split())` yapıyordu; bu satır
sonlarını da eziyor ve tweetler tek blok hâlinde, okunmaz çıkıyordu.
Oysa spor hesapları satır aralarını kullanır:

    ⚽ Dia Saba'nın müthiş golü!
    Amed 3-0 önde.

    #AMDvERZ

Burada satır yapısı KORUNUR, yalnızca fazlalık temizlenir.
"""
import re

# Kaynak hesapların marka etiketleri — kendi tweetimizde yer almaz.
# Yayıncının markasını taşımak hem bizim hesabımızı onların uzantısı gibi
# gösterir hem de gereksiz karakter yer.
BLOCKED_TAGS = {"beinsports", "beinsport", "beinsportstr", "bein"}


def block_tags_from_sources(handles) -> set:
    """Kaynak hesap adlarından engellenecek etiketleri türet."""
    out = set(BLOCKED_TAGS)
    for h in handles or []:
        base = (h or "").split("_")[0].strip().lower()
        if len(base) >= 4:
            out.add(base)
    return out


def strip_hashtags(text: str, blocked: set) -> str:
    """Engelli etiketleri metinden çıkarır (büyük/küçük harf duyarsız)."""
    if not text or not blocked:
        return text

    def repl(m):
        return "" if m.group(1).lower() in blocked else m.group(0)

    text = re.sub(r"#([\wçğıöşüÇĞİÖŞÜ]+)", repl, text)
    # Silinen etiketten kalan çift boşluk / boşta kalan satırı topla
    text = re.sub(r"[ \t]{2,}", " ", text)
    return text


# Kulüp adlarındaki kurumsal ekler — tweet dilinde tuhaf duruyor
# ("GNK Dinamo Zagreb'de erken gol" yerine "Dinamo Zagreb'de erken gol").
_CLUB_PREFIXES = ("GNK ", "NK ", "FK ", "FC ", "CF ", "AC ", "AS ", "SS ",
                  "SK ", "BK ", "IF ", "KAA ", "RSC ", "PFC ", "CD ", "RC ")
_CLUB_SUFFIXES = (" FK", " FC", " JK", " SK", " CF", " BK", " IF")


def clean_team_name(name: str) -> str:
    """Kurumsal önek/soneki temizler; ad tek kelimeye düşecekse dokunmaz."""
    if not name:
        return name
    out = name.strip()
    for p in _CLUB_PREFIXES:
        if out.startswith(p) and len(out) > len(p) + 3:
            out = out[len(p):]
            break
    for s in _CLUB_SUFFIXES:
        if out.endswith(s) and len(out) > len(s) + 3:
            out = out[: -len(s)]
            break
    return out.strip()


def normalize(text: str) -> str:
    """Satır yapısını koruyarak boşlukları düzeltir.

    - Satır içi çoklu boşluk -> tek boşluk
    - 3+ ardışık satır sonu -> 2 (yani en fazla bir boş satır)
    - Baş/son boşluklar kırpılır
    """
    if not text:
        return ""
    lines = [re.sub(r"[ \t]+", " ", ln).strip() for ln in text.splitlines()]
    text = "\n".join(lines)
    text = re.sub(r"\n{3,}", "\n\n", text)
    return text.strip()


def fit(text: str, max_len: int) -> str:
    """max_len'e sığdırır; cümle, sonra kelime sınırına saygı gösterir."""
    if len(text) <= max_len:
        return text
    window = text[:max_len]
    cut = max(window.rfind(". "), window.rfind("! "), window.rfind("? "),
              window.rfind("\n"))
    if cut >= max_len * 0.6:
        return window[: cut + 1].strip()
    cut = window.rfind(" ")
    if cut >= max_len * 0.5:
        return window[:cut].rstrip(" ,;:") + "…"
    return window[: max_len - 1].rstrip() + "…"


def append_tags(text: str, tags: list, max_len: int) -> str:
    """Etiketleri BOŞ SATIRDAN SONRA ekler (spor hesaplarının alışıldık düzeni)."""
    tags = [t for t in tags if t and t.lower() not in text.lower()]
    if not tags:
        return text
    block = " ".join(tags)
    if len(text) + len(block) + 2 > max_len:
        # yer dar: araya boş satır koymadan, tek boşlukla dene
        if len(text) + len(block) + 1 <= max_len:
            return f"{text} {block}"
        return text
    return f"{text}\n\n{block}"
