#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""웹진 전용 네이버 상세수집기.

기존 services/naver_response_article_fetcher.py의 상세수집·DB 저장 로직은
그대로 사용하고, 이미지 파일 다운로드만 네이버 원본 URL 저장으로 바꾼다.
공용 수집기 파일을 수정하지 않으므로 네이버 블로그/CDN 파이프라인에는
영향을 주지 않는다.
"""

from __future__ import annotations

import argparse
import sys
from pathlib import Path
from typing import Any


FILE_PATH = Path(__file__).resolve()
ROOT_DIR = FILE_PATH.parents[1]
if str(ROOT_DIR) not in sys.path:
    sys.path.insert(0, str(ROOT_DIR))

from services import naver_response_article_fetcher as base  # noqa: E402


def remote_image_reference(
    self: Any,
    image_url: str,
    article_no: str,
    category: str,
    file_name: str,
) -> dict[str, Any]:
    """이미지를 내려받지 않고 정규화된 네이버 원본 URL을 반환한다."""
    normalized = self.normalize_image_url(image_url)
    if not normalized:
        return {
            "success": False,
            "file_path": "",
            "public_url": "",
            "error": "empty image_url",
        }
    if self.is_bad_image_url(normalized):
        return {
            "success": False,
            "file_path": "",
            "public_url": "",
            "error": "bad image url filtered",
        }
    print(
        "[MULTI IMAGE REMOTE]",
        article_no,
        category,
        file_name,
        normalized,
        flush=True,
    )
    return {
        "success": True,
        "file_path": "",
        "public_url": normalized,
        "error": "",
    }


def selected_target_loader(article_nos: list[str]):
    """지정한 매물번호 순서대로 대상 행을 반환하는 load_targets를 만든다."""
    ordered = [str(value).strip() for value in article_nos if str(value).strip()]

    def load_targets(self: Any, limit: int = 20, realtor_id: int | None = None, article_no: str | None = None):
        if article_no:
            selected = [str(article_no).strip()]
        else:
            selected = ordered[: max(1, int(limit or len(ordered) or 20))]
        if not selected:
            return []
        marks = ",".join(["%s"] * len(selected))
        sql = f"""
            SELECT id,realtor_id,article_no
              FROM blog_realtor_articles
             WHERE article_no IN ({marks})
        """
        params: list[Any] = list(selected)
        if realtor_id is not None:
            sql += " AND realtor_id=%s"
            params.append(int(realtor_id))
        conn = base.get_conn()
        try:
            with conn.cursor(base.pymysql.cursors.DictCursor) as cur:
                cur.execute(sql, params)
                rows = list(cur.fetchall() or [])
        finally:
            conn.close()
        rank = {value: index for index, value in enumerate(selected)}
        rows.sort(key=lambda row: rank.get(str(row.get("article_no")), len(rank)))
        print(
            "[MULTI BATCH TARGETS]",
            "realtor_id=", realtor_id,
            "count=", len(rows),
            flush=True,
        )
        return rows

    return load_targets


def main() -> None:
    parser = argparse.ArgumentParser(add_help=False)
    parser.add_argument("--article-nos", default="")
    options, remaining = parser.parse_known_args()
    article_nos = [value.strip() for value in options.article_nos.split(",") if value.strip()]
    sys.argv = [sys.argv[0], *remaining]

    # 공용 모듈 파일은 수정하지 않고 이 프로세스 안에서만 다운로드 함수를 교체한다.
    base.NaverResponseArticleFetcher.download_image_to_local = remote_image_reference
    if article_nos:
        base.NaverResponseArticleFetcher.load_targets = selected_target_loader(article_nos)
    base.main()


if __name__ == "__main__":
    main()
