"""Reward redemption validators — Phase 7.3."""
from __future__ import annotations

from shared.exceptions import AppError

from app.models.foundation import Reward
from app.models.types import MemberStatus, RedemptionStatus, RewardStatus


def ensure_reward_active(reward: Reward) -> None:
    if reward.is_deleted or reward.status != RewardStatus.ACTIVE:
        raise AppError(
            "پاداش فعال نیست",
            status_code=409,
            error_code="reward_not_active",
        )


def ensure_stock_available(reward: Reward) -> None:
    if reward.stock_limit is not None and reward.redeemed_count >= reward.stock_limit:
        raise AppError(
            "موجودی پاداش تمام شده است",
            status_code=409,
            error_code="reward_stock_exhausted",
        )


def ensure_max_per_member(current_count: int, max_per_member: int | None) -> None:
    if max_per_member is not None and current_count >= max_per_member:
        raise AppError(
            "سقف بازخرید این پاداش برای این عضو تکمیل شده است",
            status_code=409,
            error_code="reward_max_per_member_exceeded",
        )


def ensure_member_active(status: MemberStatus) -> None:
    if status != MemberStatus.ACTIVE:
        raise AppError(
            "عضو فعال نیست",
            status_code=409,
            error_code="member_not_active",
        )


def ensure_fulfillable(status: RedemptionStatus) -> None:
    if status != RedemptionStatus.PENDING:
        raise AppError(
            "فقط درخواست‌های در انتظار قابل تحویل هستند",
            status_code=409,
            error_code="redemption_not_pending",
        )


def ensure_cancellable(status: RedemptionStatus) -> None:
    if status != RedemptionStatus.PENDING:
        raise AppError(
            "فقط درخواست‌های در انتظار قابل لغو هستند",
            status_code=409,
            error_code="redemption_not_pending",
        )
