#!/usr/bin/env python3
"""ODL OCR 스크립트 — 스캔된 PDF에서 OCR 텍스트를 추출하여 stdout으로 출력.

OCR은 hybrid 모드에서만 동작합니다. --hybrid 옵션을 지정하지 않으면
자동으로 hybrid='docling-fast'가 설정됩니다.
"""

import argparse
import os
import shutil
import sys
import tempfile
from typing import Optional


def _setup_java() -> None:
    java_home = os.environ.get("JAVA_HOME", "/home/jay/.local/jvm/jdk-11.0.2")
    os.environ["JAVA_HOME"] = java_home
    bin_dir = os.path.join(java_home, "bin")
    path = os.environ.get("PATH", "")
    if bin_dir not in path.split(os.pathsep):
        os.environ["PATH"] = bin_dir + os.pathsep + path


def _ext_for_format(fmt: str) -> str:
    mapping = {
        "markdown": ".md",
        "text": ".txt",
    }
    return mapping.get(fmt, f".{fmt}")


def _find_output_file(output_dir: str, stem: str, fmt: str) -> Optional[str]:
    ext = _ext_for_format(fmt)
    candidate = os.path.join(output_dir, stem + ext)
    if os.path.exists(candidate):
        return candidate
    for name in os.listdir(output_dir):
        if name.endswith(ext):
            return os.path.join(output_dir, name)
    return None


def main() -> None:
    parser = argparse.ArgumentParser(
        description=(
            "ODL hybrid 모드를 사용하여 스캔 PDF에서 OCR 텍스트를 추출합니다. "
            "--hybrid를 생략하면 자동으로 docling-fast가 사용됩니다."
        ),
    )
    parser.add_argument("input_path", help="입력 PDF 파일 경로")
    parser.add_argument(
        "--ocr-lang",
        dest="ocr_lang",
        default="ko,en",
        help="OCR 언어 코드 (기본: ko,en) — 현재 ODL에서 직접 지원 시 활용",
    )
    parser.add_argument(
        "--force-ocr",
        dest="force_ocr",
        action="store_true",
        default=False,
        help="전체 페이지를 OCR 처리 (hybrid_mode=full)",
    )
    parser.add_argument(
        "--format",
        choices=["markdown", "text"],
        default="text",
        help="출력 형식 (기본: text)",
    )
    parser.add_argument(
        "--pages",
        default=None,
        help='처리할 페이지 범위 (예: "1,3,5-7")',
    )
    parser.add_argument(
        "--hybrid",
        choices=["off", "docling-fast"],
        default=None,
        help="AI 하이브리드 백엔드 (기본: docling-fast 자동 설정)",
    )
    parser.add_argument(
        "--hybrid-url",
        dest="hybrid_url",
        default=None,
        help="하이브리드 서버 URL",
    )
    parser.add_argument(
        "--hybrid-timeout",
        dest="hybrid_timeout",
        default=None,
        help="하이브리드 서버 타임아웃 (ms, 기본: 30000)",
    )
    args = parser.parse_args()

    if not os.path.isfile(args.input_path):
        print(f"오류: 파일을 찾을 수 없습니다: {args.input_path}", file=sys.stderr)
        sys.exit(1)

    # OCR은 hybrid 모드에서만 동작 — 미지정 시 자동으로 docling-fast 설정
    hybrid: str = args.hybrid if args.hybrid is not None else "docling-fast"

    # --force-ocr 시 hybrid_mode=full (트리아지 없이 전 페이지 AI 처리)
    hybrid_mode: Optional[str] = "full" if args.force_ocr else "auto"

    _setup_java()

    from opendataloader_pdf import convert  # noqa: PLC0415

    tmpdir = tempfile.mkdtemp()
    try:
        convert(
            args.input_path,
            output_dir=tmpdir,
            format=args.format,
            pages=args.pages,
            hybrid=hybrid,
            hybrid_mode=hybrid_mode,
            hybrid_url=args.hybrid_url,
            hybrid_timeout=args.hybrid_timeout,
            hybrid_fallback=False,
            quiet=True,
        )

        stem = os.path.splitext(os.path.basename(args.input_path))[0]
        result_path = _find_output_file(tmpdir, stem, args.format)
        if result_path is None:
            print(
                f"오류: 변환 결과 파일을 찾을 수 없습니다. (디렉토리: {tmpdir})",
                file=sys.stderr,
            )
            sys.exit(1)

        with open(result_path, encoding="utf-8") as fp:
            sys.stdout.write(fp.read())

    except Exception as exc:
        err_msg = str(exc)
        # hybrid 서버 접근 불가 시 명확한 안내 메시지 출력
        if (
            "hybrid" in err_msg.lower()
            or "connection" in err_msg.lower()
            or "url" in err_msg.lower()
        ):
            print(
                "오류: hybrid 서버에 접근할 수 없습니다.\n"
                "  - --hybrid-url 옵션으로 서버 주소를 확인하세요.\n"
                "  - OCR 처리는 hybrid 백엔드 서버가 실행 중이어야 합니다.\n"
                f"  - 원본 오류: {exc}",
                file=sys.stderr,
            )
        else:
            print(f"오류: 변환 중 예외가 발생했습니다: {exc}", file=sys.stderr)
        sys.exit(1)
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)


if __name__ == "__main__":
    main()
