# -*- coding: utf-8 -*-
"""
STEP103-17 V2 ResumeStrategy

역할:
- ResumeInspector 결과를 받아 다음 실행 전략을 결정한다.
- 실제 실행은 하지 않고 "어디서부터 재개할지"만 판단한다.

전략:
- pipeline / unknown → full_pipeline
- session 중단      → collect_and_after
- collect 중단      → draft_and_after
- draft 중단        → publish_and_after
- publish 중단      → publish_retry
"""

from dataclasses import dataclass
from typing import Any


@dataclass
class ResumeStrategyResult:
    should_resume: bool
    action: str
    message: str
    resume_from: str | None = None
    realtor_id: int | None = None
    pipeline_id: str | None = None
    article_no: str | None = None
    draft_id: int | None = None
    publish_queue_id: int | None = None
    meta: dict[str, Any] | None = None


class ResumeStrategy:
    STAGE_ORDER = [
        "pipeline",
        "session",
        "collect",
        "draft",
        "publish",
    ]

    def decide(self, inspection) -> ResumeStrategyResult:
        if not inspection:
            return ResumeStrategyResult(
                should_resume=False,
                action="none",
                message="inspection result is empty",
            )

        if not inspection.should_resume:
            return ResumeStrategyResult(
                should_resume=False,
                action="none",
                message=f"resume not required: {inspection.reason}",
                realtor_id=inspection.realtor_id,
                pipeline_id=inspection.pipeline_id,
                article_no=inspection.article_no,
                draft_id=inspection.draft_id,
                publish_queue_id=inspection.publish_queue_id,
                meta={"reason": inspection.reason},
            )

        stage = str(inspection.stage or "").strip().lower()

        if stage in {"", "pipeline"}:
            return self._result(
                inspection,
                action="full_pipeline",
                resume_from="session",
                message="전체 Pipeline을 처음부터 재실행합니다.",
            )

        if stage == "session":
            return self._result(
                inspection,
                action="collect_and_after",
                resume_from="collect",
                message="세션 이후 단계부터 재개합니다.",
            )

        if stage == "collect":
            return self._result(
                inspection,
                action="draft_and_after",
                resume_from="draft",
                message="수집 이후 초안/발행 단계부터 재개합니다.",
            )

        if stage == "draft":
            return self._result(
                inspection,
                action="publish_and_after",
                resume_from="publish",
                message="초안 이후 발행 단계부터 재개합니다.",
            )

        if stage == "publish":
            return self._result(
                inspection,
                action="publish_retry",
                resume_from="publish",
                message="발행 단계를 동일 Queue 기준으로 재시도합니다.",
            )

        return self._result(
            inspection,
            action="full_pipeline",
            resume_from="session",
            message=f"알 수 없는 stage={stage}. 안전하게 전체 Pipeline을 재실행합니다.",
        )

    def _result(self, inspection, action, resume_from, message):
        return ResumeStrategyResult(
            should_resume=True,
            action=action,
            resume_from=resume_from,
            message=message,
            realtor_id=inspection.realtor_id,
            pipeline_id=inspection.pipeline_id,
            article_no=inspection.article_no,
            draft_id=inspection.draft_id,
            publish_queue_id=inspection.publish_queue_id,
            meta={
                "reason": inspection.reason,
                "last_stage": inspection.stage,
            },
        )
