"""Training modifier boundary.

Nutrition, fatigue and injuries are implemented authoritative domains. Coach/staff quality is resolved by the Staff domain for TEAM training. Individual training remains neutral. Client-supplied multipliers are never accepted.
"""

from dataclasses import dataclass
from decimal import Decimal

from injuries.resolver import FatigueResolver, InjuryResolver
from nutrition.resolver import NutritionResolver

from .engine import TrainingModifiers
from .exceptions import TrainingPlayerMedicallyUnavailableError


@dataclass(frozen=True)
class AuthoritativeTrainingModifierResolver:
    def resolve(self, *, player, session, coach_multiplier=Decimal("1.000000")) -> TrainingModifiers:
        nutrition = NutritionResolver.for_player(player=player)
        fatigue = FatigueResolver.for_player(player=player)
        injury = InjuryResolver.for_player(player=player)
        if injury.training_prohibited:
            raise TrainingPlayerMedicallyUnavailableError(
                "Player has an active injury that prohibits normal training."
            )
        return TrainingModifiers(
            nutrition=nutrition.multiplier,
            coach=coach_multiplier,
            fatigue=fatigue.training_multiplier,
            injury=injury.training_multiplier,
        )


# Backward-compatible name for callers/tests that imported the previous class.
NeutralTrainingModifierResolver = AuthoritativeTrainingModifierResolver
