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

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",
        "json": ".json",
        "html": ".html",
    }
    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을 사용하여 PDF에서 텍스트를 추출하고 stdout으로 출력합니다.",
    )
    parser.add_argument("input_path", help="입력 PDF 파일 경로")
    parser.add_argument(
        "--format",
        choices=["markdown", "text"],
        default="markdown",
        help="출력 형식 (기본: markdown)",
    )
    parser.add_argument(
        "--pages",
        default=None,
        help='추출할 페이지 범위 (예: "1,3,5-7")',
    )
    parser.add_argument(
        "--reading-order",
        dest="reading_order",
        choices=["off", "xycut"],
        default="xycut",
        help="읽기 순서 알고리즘 (기본: xycut)",
    )
    parser.add_argument(
        "--hybrid",
        choices=["off", "docling-fast"],
        default=None,
        help="AI 하이브리드 백엔드",
    )
    parser.add_argument(
        "--hybrid-url",
        dest="hybrid_url",
        default=None,
        help="하이브리드 서버 URL",
    )
    parser.add_argument(
        "--quiet",
        action="store_true",
        default=False,
        help="ODL Java 로그 억제 (기본: 억제)",
    )
    args = parser.parse_args()

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

    _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,
            reading_order=args.reading_order,
            hybrid=args.hybrid,
            hybrid_url=args.hybrid_url,
            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:
        print(f"오류: 변환 중 예외가 발생했습니다: {exc}", file=sys.stderr)
        sys.exit(1)
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)


if __name__ == "__main__":
    main()
