""" Member-related CLI commands. """ import argparse from typing import TYPE_CHECKING if TYPE_CHECKING: from backend.cli.base import NimbusFlowCLI from backend.cli.utils import format_member_row def cmd_members_list(cli: "NimbusFlowCLI", args) -> None: """List all members with optional filters.""" print("Listing members...") # Get all classifications for lookup classifications = cli.classification_repo.list_all() classification_map = {c.ClassificationId: c.ClassificationName for c in classifications} # Apply filters if args.classification: # Find classification ID by name classification_id = None for c in classifications: if c.ClassificationName.lower() == args.classification.lower(): classification_id = c.ClassificationId break if classification_id is None: print(f"āŒ Classification '{args.classification}' not found") return members = cli.member_repo.get_by_classification_ids([classification_id]) elif args.active: members = cli.member_repo.get_active() else: members = cli.member_repo.list_all() if not members: print("No members found.") return # Print header print(f"\n{'ID':<3} | {'First Name':<12} | {'Last Name':<15} | {'Classification':<12} | {'Active':<6} | {'Email'}") print("-" * 80) # Print members for member in members: classification_name = classification_map.get(member.ClassificationId) print(format_member_row(member, classification_name)) print(f"\nTotal: {len(members)} members") def cmd_members_show(cli: "NimbusFlowCLI", args) -> None: """Show detailed information about a specific member.""" member = cli.member_repo.get_by_id(args.member_id) if not member: print(f"āŒ Member with ID {args.member_id} not found") return # Get classification name classification = None if member.ClassificationId: classification = cli.classification_repo.get_by_id(member.ClassificationId) print(f"\nšŸ“‹ Member Details (ID: {member.MemberId})") print("-" * 50) print(f"Name: {member.FirstName} {member.LastName}") print(f"Email: {member.Email or 'N/A'}") print(f"Phone: {member.PhoneNumber or 'N/A'}") print(f"Classification: {classification.ClassificationName if classification else 'N/A'}") print(f"Active: {'Yes' if member.IsActive else 'No'}") print(f"Notes: {member.Notes or 'N/A'}") print(f"\nā° Schedule History:") print(f"Last Scheduled: {member.LastScheduledAt or 'Never'}") print(f"Last Accepted: {member.LastAcceptedAt or 'Never'}") print(f"Last Declined: {member.LastDeclinedAt or 'Never'}") print(f"Decline Streak: {member.DeclineStreak}") def setup_members_parser(subparsers) -> None: """Set up member-related command parsers.""" # Members commands members_parser = subparsers.add_parser("members", help="Manage members") members_subparsers = members_parser.add_subparsers(dest="members_action", help="Members actions") # members list members_list_parser = members_subparsers.add_parser("list", help="List members") members_list_parser.add_argument("--active", action="store_true", help="Show only active members") members_list_parser.add_argument("--classification", type=str, help="Filter by classification name") # members show members_show_parser = members_subparsers.add_parser("show", help="Show member details") members_show_parser.add_argument("member_id", type=int, help="Member ID to show")