# -*- coding: utf-8 -*-
"""
V2-011 CollectAdapter - V1 schedule_daily_articles bridge

역할:
- V2 CollectStage에서 기존 jobs/schedule_daily_articles.py를 호출한다.
- V1 운영 코드는 수정하지 않는다.
- realtor_id 단건 기준으로 수집 스케줄 Job을 실행한다.
- 실행 후 blog_realtor_articles에서 해당 중개사의 최근 매물을 읽어 context로 넘긴다.

주의:
- 실제 CLI 옵션이 운영 환경과 다르면 command_args 부분만 조정하면 된다.
"""

import subprocess
import sys
from pathlib import Path

from services.v2.base_adapter import BaseAdapter


ROOT = Path(__file__).resolve().parents[2]


class CollectAdapter(BaseAdapter):
    name = "collect_adapter"

    def run(self, context) -> dict:
        return self.collect(context)

    def collect(self, context) -> dict:
        try:
            script = ROOT / "jobs" / "schedule_daily_articles.py"

            if not script.exists():
                return self.fail(
                    message=f"schedule_daily_articles.py not found: {script}",
                    data={
                        "realtor_id": context.realtor_id,
                        "script": str(script),
                    },
                    articles=[],
                )

            command_args = [
                sys.executable,
                str(script),
                "--realtor-id",
                str(context.realtor_id),
                "--limit",
                "1",
            ]

            result = subprocess.run(
                command_args,
                cwd=str(ROOT),
                capture_output=True,
                text=True,
                encoding="utf-8",
                errors="replace",
                timeout=900,
            )

            stdout = result.stdout or ""
            stderr = result.stderr or ""

            if result.returncode != 0:
                return self.fail(
                    message=f"collect job failed returncode={result.returncode}",
                    data={
                        "realtor_id": context.realtor_id,
                        "command": command_args,
                        "stdout_tail": stdout[-4000:],
                        "stderr_tail": stderr[-4000:],
                    },
                    articles=[],
                )

            articles = self.fetch_recent_articles(context.realtor_id, limit=10)

            return self.ok(
                message=f"collect job completed: recent_articles={len(articles)}",
                data={
                    "realtor_id": context.realtor_id,
                    "command": command_args,
                    "stdout_tail": stdout[-4000:],
                    "stderr_tail": stderr[-4000:],
                    "collect_count": len(articles),
                },
                articles=articles,
            )

        except subprocess.TimeoutExpired as e:
            return self.fail(
                message=f"collect job timeout: {e}",
                data={
                    "realtor_id": context.realtor_id,
                    "error": str(e),
                },
                articles=[],
            )

        except Exception as e:
            return self.fail(
                message=f"collect adapter failed: {e}",
                data={
                    "realtor_id": context.realtor_id,
                    "error": str(e),
                },
                articles=[],
            )

    def fetch_recent_articles(self, realtor_id: int, limit: int = 10) -> list[dict]:
        try:
            from db import get_conn

            conn = get_conn()

            try:
                with conn.cursor() as cur:
                    cur.execute(
                        """
                        SELECT
                            id,
                            realtor_id,
                            article_no,
                            article_name,
                            real_estate_type,
                            building_name,
                            detail_collected,
                            created_at,
                            updated_at
                        FROM blog_realtor_articles
                        WHERE realtor_id=%s
                        ORDER BY id DESC
                        LIMIT %s
                        """,
                        (int(realtor_id), int(limit)),
                    )
                    rows = cur.fetchall() or []

                return [dict(row) for row in rows]

            finally:
                conn.close()

        except Exception as e:
            return [
                {
                    "error": f"fetch_recent_articles failed: {e}",
                    "realtor_id": realtor_id,
                }
            ]
