"""
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.
"""


def get_integer(prompt_text: str) -> int:
    """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: str) -> float:
    """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 score_label(composite_score: float) -> str:
    """Return a representative competitive label for a demo score."""
    if composite_score >= 98.0:
        return "Best in Show contender"
    if composite_score >= 95.0:
        return "Group-finalist range"
    if composite_score >= 92.0:
        return "Strong Best of Breed range"
    return "Developing campaign range"


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_integer(
        "Breed category rank as an integer (1=BOB winner, 2=BOS, 3/4=Select): "
    )
    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} (type: {type(breed_rank).__name__})")
    print(f"group_placement = {group_placement} (type: {type(group_placement).__name__})")
    print(f"composite_score = {composite_score:.2f} (type: {type(composite_score).__name__})")

    if breed_rank == 1:
        breed_result = "Best of Breed (BOB)"
    elif breed_rank == 2:
        breed_result = "Best of Opposite Sex (BOS)"
    else:
        breed_result = "Select placement"

    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 interpretation: {score_label(composite_score)}")

    show_projections = input("\nShow demo projections? (yes/no): ").strip().lower() == "yes"

    if show_projections:
        if breed_rank == 1 and group_placement == 1 and composite_score >= 98.0:
            print("- Demo projection: Could advance as a Best in Show-level profile.")
        elif breed_rank <= 2 and group_placement <= 2 and composite_score >= 95.0:
            print("- Demo projection: Strong Reserve Best in Show-type profile.")
        else:
            print("- Demo projection: Competitive profile with room to improve handling/details.")


if __name__ == "__main__":
    main()
