"""
Westminster-Style Input Conversion Demo

Purpose:
- Prompt for text input, then convert selected inputs to integer/real numbers.
- Use recognizable Westminster Kennel Club Dog Show terms.
- Demonstrate safe conversion with validation loops.

Note:
This is an educational demo. The scoring bands below are representative
practice data, not official Westminster judging rules.

Generated by Claude Sonnet 4.6 • 0.9x for user customization on 2026-05-02.
"""


BREED_PLACEMENTS = {
    "BOB": "Best of Breed",
    "BOS": "Best of Opposite Sex",
    "SD":  "Select Dog (best male after BOB/BOS)",
    "SB":  "Select Bitch (best female after BOB/BOS)",
}


def get_integer(prompt_text):
    # Read user text and convert it to an integer, retrying on invalid input.
    while True:
        user_text = input(prompt_text)
        try:
            return int(user_text)
        except ValueError:
            print("Please enter a whole number (example: 1, 2, 3).")


def get_real(prompt_text):
    # Read user text and convert it to a floating-point number.
    while True:
        user_text = input(prompt_text)
        try:
            return float(user_text)
        except ValueError:
            print("Please enter a real number (example: 96.4 or 92).")


def get_breed_placement(prompt_text):
    # Prompt until the user enters a valid breed placement code.
    valid = ", ".join(BREED_PLACEMENTS.keys())
    while True:
        user_text = input(prompt_text).strip().upper()
        if user_text in BREED_PLACEMENTS:
            return user_text
        print(f"Please enter one of: {valid}")


def main() -> None:
    print("=" * 62)
    print("WESTMINSTER DOG SHOW INPUT DEMO")
    print("=" * 62)
    print("Common terms: Best of Breed (BOB), Group placement, Best in Show.")
    print("Groups: Sporting, Hound, Working, Terrier, Toy, Non-Sporting, Herding")
    print()

    dog_name = input("Name of the prize-winning dog: ").strip()
    breed = input("Breed (example: Miniature Poodle): ").strip()
    group_name = input("AKC Group for this dog (example: Non-Sporting): ").strip()

    breed_rank = get_breed_placement(
        "Breed placement (BOB=Best of Breed, BOS=Best of Opposite Sex, SD=Select Dog, SB=Select Bitch): "
    )
    group_placement = get_integer(
        "Group placement as an integer (1-4, where 1 wins the group): "
    )
    composite_score = get_real(
        "Composite score as a real number (example: 96.35): "
    )

    print("\n" + "-" * 62)
    print("CONVERTED VALUES")
    print("-" * 62)
    print(f"Dog name: {dog_name}")
    print(f"Breed: {breed}")
    print(f"Group: {group_name}")
    print(f"breed_rank = {breed_rank!r} \t\t(type: {type(breed_rank).__name__}) → {BREED_PLACEMENTS[breed_rank]}")
    print(f"group_placement = {group_placement} \t\t(type: {type(group_placement).__name__})")
    print(f"composite_score = {composite_score:.2f} \t(type: {type(composite_score).__name__})")

    breed_result = BREED_PLACEMENTS[breed_rank]

    if group_placement == 1:
        group_result = "Group Winner"
    elif 2 <= group_placement <= 4:
        group_result = f"Group placement #{group_placement}"
    else:
        group_result = "Outside standard group placement range"

    print("\n" + "-" * 62)
    print("REPRESENTATIVE WESTMINSTER-STYLE SUMMARY")
    print("-" * 62)
    print(f"{dog_name} ({breed}) results:")
    print(f"- Breed level: {breed_result}")
    print(f"- Group level: {group_result} in the {group_name} Group")
    print(f"- Composite score: {composite_score:.2f}")


if __name__ == "__main__":
    main()
