# -*- coding: utf-8 -*-
"""
STEP103-21 V2 ResumeExecutor

역할:
- ResumeStrategyResult를 PipelineContext에 반영한다.
- Scheduler가 Resume 세부 로직을 직접 알 필요 없게 한다.
- 새 pipeline_id로 실행하되, 기존 실패 pipeline_id를 resume_original_pipeline_id로 남긴다.

핵심:
- strategy.resume_from 값이 있으면 context.resume_from에 저장한다.
- PipelineManager는 context.resume_from 기준으로 앞 Stage를 skipped 처리한다.
"""

from services.v2.resume_strategy import ResumeStrategy


class ResumeExecutor:
    def __init__(self):
        self.strategy = ResumeStrategy()

    def prepare_context(self, context, inspection):
        """
        inspection: ResumeInspector.inspect() 결과
        context: 새로 생성된 PipelineContext

        return:
            strategy_result
        """
        strategy_result = self.strategy.decide(inspection)

        context.put("resume_should_resume", bool(strategy_result.should_resume))
        context.put("resume_action", strategy_result.action)
        context.put("resume_message", strategy_result.message)

        if not strategy_result.should_resume:
            return strategy_result

        context.put("resume_from", strategy_result.resume_from)
        context.put("resume_reason", (strategy_result.meta or {}).get("reason"))
        context.put("resume_last_stage", (strategy_result.meta or {}).get("last_stage"))

        context.put("resume_original_pipeline_id", strategy_result.pipeline_id)
        context.put("resume_original_realtor_id", strategy_result.realtor_id)
        context.put("resume_article_no", strategy_result.article_no)
        context.put("resume_draft_id", strategy_result.draft_id)
        context.put("resume_publish_queue_id", strategy_result.publish_queue_id)

        # Stage/Adapter에서 직접 참조할 수 있도록 일반 키도 보강
        if strategy_result.article_no:
            context.put("article_no", strategy_result.article_no)
        if strategy_result.draft_id:
            context.put("draft_id", strategy_result.draft_id)
        if strategy_result.publish_queue_id:
            context.put("publish_queue_id", strategy_result.publish_queue_id)

        return strategy_result

    def to_meta(self, strategy_result):
        if not strategy_result:
            return None

        return {
            "should_resume": strategy_result.should_resume,
            "action": strategy_result.action,
            "resume_from": strategy_result.resume_from,
            "message": strategy_result.message,
            "pipeline_id": strategy_result.pipeline_id,
            "realtor_id": strategy_result.realtor_id,
            "article_no": strategy_result.article_no,
            "draft_id": strategy_result.draft_id,
            "publish_queue_id": strategy_result.publish_queue_id,
            "meta": strategy_result.meta,
        }
