# -*- coding: utf-8 -*-
"""
STEP104-05 HPE PublishBridge

역할:
- 기존 publish_worker.py의 publish_one(queue)을 바로 수정하지 않고 HPE로 감싼다.
- PublishSession / BehaviorLogger / HumanPublishEngine을 생성한다.
- 기존 발행 동작은 handler 콜백으로 그대로 실행한다.
- 검증이 끝난 뒤 publish_worker.py에 최소 수정으로 연결할 수 있다.

중요:
- 이 파일은 기존 운영 발행 로직을 대체하지 않는다.
- 안정적인 리팩토링을 위한 Bridge 계층이다.
"""

from services.v2.human_publish.session import PublishSession
from services.v2.human_publish.logger import BehaviorLogger
from services.v2.human_publish.engine import HumanPublishEngine


class HpePublishBridge:
    version = "hpe-bridge-0.1"

    def __init__(self, conn=None, verbose=True):
        self.conn = conn
        self.verbose = verbose

    def run(self, queue, handler, pipeline_id=None, actor_name="default", profile_name="default"):
        """
        queue:
            publish_worker.get_pending_queue()가 반환한 queue dict

        handler:
            기존 publish_one(queue) 같은 실제 발행 콜백.
            예:
                lambda session: publish_one(queue)

        pipeline_id:
            V2 pipeline_id. 없으면 queue에서 최대한 추론한다.
        """
        queue = queue or {}

        session = PublishSession(
            pipeline_id=pipeline_id or queue.get("pipeline_id"),
            realtor_id=queue.get("realtor_id"),
            publish_queue_id=queue.get("id"),
            article_no=(
                queue.get("article_no")
                or queue.get("queue_article_no")
                or queue.get("draft_article_no")
            ),
            draft_id=queue.get("draft_id"),
            actor_name=actor_name,
            profile_name=profile_name,
        )

        logger = BehaviorLogger(
            conn=self.conn,
            verbose=self.verbose,
        )

        engine = HumanPublishEngine(logger=logger)

        def wrapped_handler(hpe_session):
            with hpe_session.step(
                "legacy_publish_worker",
                logger=logger,
                meta={
                    "bridge_version": self.version,
                    "queue_id": queue.get("id"),
                    "article_no": hpe_session.article_no,
                },
            ):
                result = handler(hpe_session)

            if isinstance(result, dict):
                return result

            return {
                "status": "completed",
                "result": result,
            }

        result = engine.run(
            session=session,
            handler=wrapped_handler,
        )

        return {
            "bridge_version": self.version,
            "session": session.to_dict(),
            "logger_records": logger.records,
            "result": result,
        }
