"""Point ledger validators — Phase 7.2."""
from __future__ import annotations

from shared.exceptions import AppError

from app.models.types import LedgerEntryType, PointAccountStatus


def ensure_account_open(status: PointAccountStatus) -> None:
    if status == PointAccountStatus.CLOSED:
        raise AppError(
            "حساب امتیاز بسته است",
            status_code=409,
            error_code="point_account_closed",
        )
    if status == PointAccountStatus.FROZEN:
        raise AppError(
            "حساب امتیاز مسدود است",
            status_code=409,
            error_code="point_account_frozen",
        )


def validate_positive_points(amount: int, *, field: str = "amount") -> int:
    if amount is None or amount <= 0:
        raise AppError(
            f"{field} باید بزرگ‌تر از صفر باشد",
            status_code=422,
            error_code="invalid_points_amount",
            details={"field": field},
        )
    return amount


def validate_adjust_amount(amount: int) -> int:
    if amount == 0:
        raise AppError(
            "مقدار تعدیل نمی‌تواند صفر باشد",
            status_code=422,
            error_code="invalid_adjust_amount",
        )
    return amount


def signed_amount(entry_type: LedgerEntryType, amount: int) -> int:
    if entry_type in {LedgerEntryType.EARN}:
        return abs(amount)
    if entry_type in {LedgerEntryType.REDEEM, LedgerEntryType.EXPIRE}:
        return -abs(amount)
    # ADJUST: caller supplies signed amount
    return amount
