from pathlib import Path
import fitz
import re
import time
import logging
from datetime import datetime
from scripts.config import SOURCE_DIRS, EXCLUDE_DIRS, FINAL_POLKI, PROCESSED_DIR
from scripts.ocr_handler import extract_text_with_ocr

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

def quick_old_russian_check(pdf_path: Path) -> bool:
    """Агрессивная проверка: делаем OCR на первых страницах"""
    try:
        logger.info(f"   Быстрая OCR-проверка на дореформенность...")
        # Делаем OCR только первых 6 страниц
        text = extract_text_with_ocr(pdf_path, is_old_russian=True)[:8000]

        old_count = len(re.findall(r'\b\w+ъ\b', text)) + len(re.findall(r'\b\w+ъ[.,;:!?]', text))

        logger.info(f"   Результат проверки: найдено {old_count} твёрдых знаков")
        return old_count >= 25

    except Exception as e:
        logger.error(f"Ошибка быстрой проверки {pdf_path.name}: {e}")
        return False


def process_single_pdf(pdf_path: Path):
    start_time = time.time()
    logger.info(f"Обработка: {pdf_path.name}")

    try:
        if any(ex in pdf_path.parents for ex in EXCLUDE_DIRS):
            logger.info(f"   → Пропущен (исключение)")
            return None

        # === Главное изменение ===
        is_old = quick_old_russian_check(pdf_path)

        # Извлечение полного текста
        if is_old:
            logger.info(f"   → Определён как СТАРОРУССКИЙ → улучшенный OCR всего документа")
            text = extract_text_with_ocr(pdf_path, is_old_russian=True)
        else:
            logger.info(f"   → Определён как современный")
            doc = fitz.open(pdf_path)
            text = "".join(page.get_text() for page in doc)
            doc.close()

            # Если текста всё равно мало — делаем OCR
            if len(text.strip()) < 400:
                logger.info(f"   → Мало текста → делаем OCR")
                text = extract_text_with_ocr(pdf_path, is_old_russian=False)

        if len(text.strip()) < 50:
            logger.warning(f"   ⚠️ Критически мало текста ({len(text.strip())} символов)")
            return None

        # Сохранение текста
        processed_file = PROCESSED_DIR / f"{pdf_path.stem}.txt"
        with open(processed_file, "w", encoding="utf-8") as f:
            f.write(text)

        # Перемещение
        path_str = str(pdf_path).lower()
        category = "water" if any(x in path_str for x in ["водник", "мелиора", "аграр"]) else "history"

        target_dir = FINAL_POLKI[category] / ("Старорусский" if is_old else "Современный")
        target_dir.mkdir(parents=True, exist_ok=True)

        target_path = target_dir / pdf_path.name

        if not target_path.exists():
            pdf_path.rename(target_path)
            status = "Старорусский" if is_old else "Современный"
            logger.info(f"   → Перемещён → {category}/{status}")
        else:
            logger.info(f"   → Уже существует")

        logger.info(f"   ✓ Завершено за {time.time()-start_time:.1f} сек")
        return target_path

    except Exception as e:
        logger.error(f"Ошибка обработки {pdf_path.name}: {e}")
        return None


if __name__ == "__main__":
    print("=== Запуск обработчика v9 (агрессивное OCR-определение) ===")
    print(f"Время: {datetime.now()}\n")

    total = 0
    for source in SOURCE_DIRS:
        if not source.exists():
            print(f"Папка не найдена: {source}")
            continue

        pdf_files = list(source.rglob("*.pdf"))
        print(f"Найдено PDF в {source.name}: {len(pdf_files)}")

        for pdf in pdf_files:
            process_single_pdf(pdf)
            total += 1

    print(f"\n=== Обработка завершена. Всего обработано: {total} файлов ===")
