# -*- coding: utf-8 -*-
"""Scan translation files and SQL dumps for garbled values."""
import re, pathlib

ROOT = pathlib.Path(r"C:\Users\Семья\alrent")

def weird_in(text):
    out = []
    for i, ch in enumerate(text):
        c = ord(ch)
        if c == 0xFFFD:
            out.append((i, "FFFD"))
        elif c > 127 and not (
            0x0400 <= c <= 0x04FF or 0x00A0 <= c <= 0x00FF
            or 0x2010 <= c <= 0x203F or 0x2000 <= c <= 0x200F
            or c == 0x20BD or 0x2190 <= c <= 0x21FF
            or 0x2600 <= c <= 0x27BF or 0x1F300 <= c <= 0x1FAFF
            or 0x2200 <= c <= 0x22FF or c in (0x00D7, 0x00F7, 0x2116)
        ):
            out.append((i, f"U+{c:04X}"))
    return out

print("===== TRANSLATION FILES =====")
for p in [
    ROOT / "storage" / "translations" / "ru" / "content.tr",
    ROOT / "storage" / "translations" / "default.tr",
    ROOT / "storage" / "translations" / "ru" / "js.tr",
    ROOT / "storage" / "translations" / "js.tr",
]:
    text = p.read_text(encoding="utf-8", errors="replace")
    # parse 'key' => 'value'
    entries = re.findall(r"'(tr_[a-f0-9]{32})'\s*=>\s*'((?:\\'|[^'])*)'", text)
    bad = []
    empty = []
    hashlike = []
    for k, v in entries:
        v2 = v.encode("utf-8", "replace").decode("utf-8", "replace")
        w = weird_in(v2)
        if w:
            bad.append((k, v[:80], w[:5]))
        if not v.strip():
            empty.append(k)
        # value looks like a hash / key itself
        if re.fullmatch(r"tr_[a-f0-9]{32}", v) or re.fullmatch(r"[a-f0-9]{32}", v):
            hashlike.append((k, v))
        # value is mostly non-letters (garbage)
        letters = sum(1 for c in v if c.isalpha() or 0x0400 <= ord(c) <= 0x04FF)
        if v and letters < len(v) * 0.2 and len(v) > 4:
            hashlike.append((k, v[:80]))
    print(f"{p.name}: entries={len(entries)} bad={len(bad)} empty={len(empty)} hashlike={len(hashlike)}")
    for item in bad[:15]:
        print("  BAD", item)
    for item in empty[:10]:
        print("  EMPTY", item)
    for item in hashlike[:15]:
        print("  HASHLIKE", item)

print("\n===== SQL DUMPS: look for garbled INSERT text =====")
for p in [ROOT / "database" / "alrent_schema.sql", ROOT / "database" / "full_schema.sql"]:
    # stream in chunks to find mojibake in string literals
    data = p.read_bytes()
    text = data.decode("utf-8", errors="replace")
    # find replacement chars
    rc = text.count("\ufffd")
    # find classic mojibake sequences in the dump
    m1 = re.findall(r"(?:Ð[\x80-\xbf]|Ñ[\x80-\xbf]){4,}", text)
    m2 = re.findall(r"[\u2580-\u25FF]{3,}", text)
    print(f"{p.name}: size={len(data)} repl={rc} utf8lat={len(m1)} boxes={len(m2)}")
    for s in m1[:5]:
        print("  ", repr(s[:80]))
    for s in m2[:5]:
        print("  ", repr(s[:80]))
