#!/usr/bin/env python3.11
# -*- coding: utf-8 -*-
"""
find_tkm_cyr_source_texts.py

Ищет по нашим же CSV файлам определения языка (history + VAM) все PDF,
помеченные как "туркменский (кириллица)" с уже имеющимся текстовым слоем -
это потенциальные источники ПОДЛИННОГО цифрового текста (не OCR чужим
движком, значит буквы Ә/Ң/Ө/Ү/Җ не искажены) для обучающего корпуса.

Для каждого такого файла:
  - вытаскивает весь текст через PyMuPDF,
  - проверяет, что там ДЕЙСТВИТЕЛЬНО есть туркменские буквы в достаточном
    количестве (на случай если текстовый слой хоть и есть, но плохой),
  - сохраняет как отдельный файл + манифест.
"""

import os
import re
import csv

import fitz  # pymupdf

LANGUAGE_CSVS = [
    "/home/dayhanbiz/public_html/3-damja.science/Обслуживание библиотеки истории стран бывшего Туркестана и сопредельных стран/Скрипты/Регистрация языка документов/language_detection_history.csv",
    "/home/dayhanbiz/public_html/3-damja.science/Обслуживание библиотеки водного, сельского и мелиоративного хозяйства и ресурсов стран бывшего Туркестана и сопредельных стран/Скрипты/Регистрация языка документов/language_detection_VAM.csv",
]

TARGET_LANGUAGE = "туркменский (кириллица)"

OUTPUT_DIR = "/home/dayhanbiz/public_html/3-damja.science/ТЕСТ_образцы_языков/OCR_дообучение_туркменский_кириллица/Корпус_собственный"
MANIFEST_FILE = os.path.join(OUTPUT_DIR, "manifest.csv")

TURKMEN_CYR_CHARS = set("ӘәҢңӨөҮүҖҗ")
MIN_TURKMEN_CHAR_RATIO = 0.003  # хотя бы немного реальных туркменских букв - иначе слой скорее всего испорчен
MIN_WORDS = 200

WORD_RE = re.compile(r"\w+", re.UNICODE)


def sanitize_filename(name, max_bytes=150):
    name = name.replace("/", " - ")
    name = re.sub(r'[\\*?:"<>|]', "", name)
    name = re.sub(r"\s+", " ", name).strip()
    encoded = name.encode("utf-8")
    if len(encoded) > max_bytes:
        encoded = encoded[:max_bytes]
        while encoded:
            try:
                name = encoded.decode("utf-8")
                break
            except UnicodeDecodeError:
                encoded = encoded[:-1]
    return name + ".txt"


def main():
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    candidates = []
    for csv_path in LANGUAGE_CSVS:
        if not os.path.exists(csv_path):
            print(f"Внимание: не найден {csv_path}, пропускаю")
            continue
        with open(csv_path, encoding="utf-8", newline="") as f:
            reader = csv.DictReader(f, delimiter=";")
            for row in reader:
                if (row.get("detected_language") == TARGET_LANGUAGE
                        and row.get("has_text_layer") == "True"
                        and row.get("status") == "ok"):
                    candidates.append(row["absolute_path"])

    print(f"Файлов-кандидатов (туркменский кириллица + текстовый слой): {len(candidates)}")

    manifest_rows = []
    used_filenames = set()
    good = 0
    rejected_bad_layer = 0
    rejected_short = 0

    for path in candidates:
        try:
            doc = fitz.open(path)
            full_text = ""
            for page in doc:
                full_text += page.get_text() + "\n"
            doc.close()
        except Exception as e:
            print(f"  ошибка чтения '{path}': {e}")
            continue

        words = WORD_RE.findall(full_text)
        if len(words) < MIN_WORDS:
            rejected_short += 1
            continue

        turkmen_char_count = sum(1 for ch in full_text if ch in TURKMEN_CYR_CHARS)
        ratio = turkmen_char_count / max(len(full_text), 1)

        if ratio < MIN_TURKMEN_CHAR_RATIO:
            rejected_bad_layer += 1
            print(f"  ⚠️  слой скорее всего испорчен (мало настоящих туркменских букв): {os.path.basename(path)}")
            continue

        filename = sanitize_filename(os.path.splitext(os.path.basename(path))[0])
        base, ext = os.path.splitext(filename)
        counter = 2
        while filename in used_filenames:
            filename = f"{base} ({counter}){ext}"
            counter += 1
        used_filenames.add(filename)

        with open(os.path.join(OUTPUT_DIR, filename), "w", encoding="utf-8") as f:
            f.write(full_text)

        manifest_rows.append({
            "source_pdf": path,
            "filename": filename,
            "word_count": len(words),
            "turkmen_char_ratio": f"{ratio:.4f}",
        })
        good += 1
        print(f"[{good}] {os.path.basename(path)} - слов={len(words)}, доля туркм.букв={ratio:.4f}")

    with open(MANIFEST_FILE, "w", encoding="utf-8", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=["source_pdf", "filename", "word_count", "turkmen_char_ratio"], delimiter=";")
        writer.writeheader()
        writer.writerows(manifest_rows)

    print(f"\n🎉 Готово! Годных источников: {good}")
    print(f"Отклонено (похоже, слой испорчен OCR): {rejected_bad_layer}")
    print(f"Отклонено (слишком коротко): {rejected_short}")
    print(f"📁 Корпус: {OUTPUT_DIR}")
    print(f"📋 Манифест: {MANIFEST_FILE}")


if __name__ == "__main__":
    main()
