"""Temporal Workflow 只编排确定性步骤；数据库访问放在 Activity 中。"""
from datetime import timedelta
from temporalio import workflow
from temporalio.common import RetryPolicy


@workflow.defn
class RefundWorkflow:
    def __init__(self):
        self.decision = None
        self.status = "awaiting_approval"

    @workflow.signal
    def decide(self, decision: dict):
        # 不接受字符串 true/false。重复的相同决定忽略，冲突决定由调用侧查询状态处理。
        if (not isinstance(decision, dict) or type(decision.get("approved")) is not bool
                or not decision.get("decision_id")):
            return
        if self.decision is None:
            self.decision = decision

    @workflow.query
    def current_status(self) -> str:
        # Query 只读取内存投影，不修改工作流，也不调用外部数据库。
        return self.status

    @workflow.run
    async def run(self, task_id: str) -> str:
        # 持久等待由 Temporal 调度，Worker 重启后可以依历史恢复。
        # 这里无业务过期策略；生产中应增加定时器及明确的过期分支。
        await workflow.wait_condition(lambda: self.decision is not None)
        self.status = "executing"
        self.status = await workflow.execute_activity(
            "apply_refund", args=[task_id, self.decision],
            start_to_close_timeout=timedelta(seconds=30),
            schedule_to_close_timeout=timedelta(minutes=3),
            retry_policy=RetryPolicy(maximum_attempts=3,
                                     non_retryable_error_types=["InvalidRequest"]),
        )
        return self.status
