File size: 2,130 Bytes
ee4ef53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
"""
Input validation and parsing for pet profiles.
"""
import logging
from typing import Dict, Optional

from schema import (
    PetType,
    Gender,
    LifeStage,
    ActivityLevel,
    PregnantLactating,
    NeuteredSpayed,
    PetProfile,
)

logger = logging.getLogger(__name__)

class InputHandler:
    @staticmethod
    def create_handler() -> "InputHandler":
        return InputHandler()

    def validate_and_parse(self, user_input: Dict) -> Optional[PetProfile]:
        try:
            profile = PetProfile(
                pet_type=PetType(user_input["pet_type"].lower()),
                breed=user_input["breed"].strip(),
                gender=Gender(user_input["gender"].lower()),
                pregnant_lactating=PregnantLactating(
                    (user_input.get("pregnant_lactating") or "none").lower()
                ),
                weight_kg=float(user_input["weight_kg"]),
                activity_level=ActivityLevel(user_input["activity_level"].lower()),
                life_stage=LifeStage(user_input["life_stage"].lower()),
                bcs=int(user_input["bcs"]),
                neutered_spayed=NeuteredSpayed(user_input["neutered_spayed"].lower()),
                allergies=user_input.get("allergies"),
                diseases=user_input.get("diseases"),
                diet_preference=user_input["diet_preference"],
                current_food_format=user_input["current_food_format"],
            )

            # Logical validations
            if profile.gender == Gender.MALE and profile.pregnant_lactating != PregnantLactating.NONE:
                raise ValueError("Male pets cannot be pregnant or lactating")

            if profile.pet_type == PetType.DOG and profile.life_stage == LifeStage.KITTEN:
                raise ValueError("Dog cannot have kitten life stage")

            if profile.pet_type == PetType.CAT and profile.life_stage == LifeStage.PUPPY:
                raise ValueError("Cat cannot have puppy life stage")

            return profile

        except Exception as e:
            logger.error(f"Input validation failed: {e}")
            return None