#!/usr/bin/env python3
"""ODL 테이블 추출 스크립트 — PDF에서 테이블 요소만 필터링하여 JSON으로 stdout 출력."""

import argparse
import json
import os
import shutil
import sys
import tempfile
from typing import Any, Dict, List, 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 _find_output_file(output_dir: str, stem: str) -> Optional[str]:
    candidate = os.path.join(output_dir, stem + ".json")
    if os.path.exists(candidate):
        return candidate
    for name in os.listdir(output_dir):
        if name.endswith(".json"):
            return os.path.join(output_dir, name)
    return None


def _extract_tables(data: Any) -> List[Dict[str, Any]]:
    """JSON 데이터의 최상위 kids 배열에서 type='table'인 요소를 추출."""
    if not isinstance(data, dict):
        return []
    kids = data.get("kids", [])
    if not isinstance(kids, list):
        return []
    return [
        item for item in kids if isinstance(item, dict) and item.get("type") == "table"
    ]


def main() -> None:
    parser = argparse.ArgumentParser(
        description="ODL을 사용하여 PDF에서 테이블을 추출하고 JSON으로 stdout에 출력합니다.",
    )
    parser.add_argument("input_path", help="입력 PDF 파일 경로")
    parser.add_argument(
        "--pages",
        default=None,
        help='추출할 페이지 범위 (예: "1,3,5-7")',
    )
    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="json",
            pages=args.pages,
            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)
        if result_path is None:
            print(
                f"오류: 변환 결과 파일을 찾을 수 없습니다. (디렉토리: {tmpdir})",
                file=sys.stderr,
            )
            sys.exit(1)

        with open(result_path, encoding="utf-8") as fp:
            data = json.load(fp)

        tables = _extract_tables(data)
        sys.stdout.write(json.dumps(tables, ensure_ascii=False, indent=2))
        sys.stdout.write("\n")

    except Exception as exc:
        print(f"오류: 변환 중 예외가 발생했습니다: {exc}", file=sys.stderr)
        sys.exit(1)
    finally:
        shutil.rmtree(tmpdir, ignore_errors=True)


if __name__ == "__main__":
    main()
