def main():
    """Main menu for mailroom program"""
    Donation.open_db("donations.db")

    switch_menu_dict = {
        "1": send_thank_you,
        "2": create_a_report,
        "3": send_all_letters,
        "4": run_projection,
        "5": update_donor_info,
        "6": delete_donor_info,
        "q": quit_program,
        "quit": quit_program
    }
    while True:
        print("\nMAIN MENU")
        print("   1 = Send a Thank You")
        print("   2 = Create a Report")
        print("   3 = Send Letters to Everyone")
        print("   4 = Run A Projection")
        print("   5 = Update Donor Name/Donation")
        print("   6 = Delete Donor Name/Donation")
        print("   q = Quit")
        choice = input("   ? ")
        switch_menu_dict.get(choice, main_menu_error)()
def delete_donor_info():
    while True:
        name = input("\nDonor name ('q' to quit): ")
        if name in ('q', 'quit'):
            return
        info = input(
            "   Delete name or donation amount ('name', 'amount', or 'q' to quit): "
        )
        if info in ('q', 'quit'):
            return
        if info == 'name':
            if not Donation.delete_donor(name):
                print("   Delete failed, invalid inputs")
            continue
        if info == 'amount':
            amount = input("   Amount: ")
            if not Donation.delete_donation(name, amount):
                print("   Delete failed, invalid inputs")
def update_donor_info():
    while True:
        name = input("\nDonor name ('q' to quit): ")
        if name in ('q', 'quit'):
            return
        info = input(
            "   Update name or donation amount ('name', 'amount', or 'q' to quit: "
        )
        if info in ('q', 'quit'):
            return
        if info == 'name':
            new_name = input("   New name: ")
            if not Donation.update_donor(name, new_name):
                print("   Update failed, invalid inputs")
            continue
        if info == 'amount':
            old_amount = input("   Amount: ")
            new_amount = input("   New amount: ")
            if not Donation.update_donation(name, old_amount, new_amount):
                print("   Update failed, invalid inputs")
def send_thank_you():
    """Add a donor/donation and print out a thank you letter"""
    # loop for user input: donor name, or list, or quit
    while True:
        name = input(
            "\nDonor Full Name (type 'list' for donor list or 'q' to quit): ")
        if name in ('q', 'quit'):
            return
        if name == 'list':
            print(Donation.list_donors())
            continue
        while True:
            amount = input("Donation amount (type 'q' to quit): ")
            if amount in ('q', 'quit'):
                return
            try:
                Donation.add_donation(name, amount)
            except ValueError:
                print('Invalid input, try again')
            else:
                break
        print('\n' + Donation.thank_you_letter(name))
def run_projection():
    """Run projection showing total contribution of challenge scenario"""
    while True:
        factor = input("\nChallenge factor ('q' to quit): ")
        if factor in ('q', 'quit'):
            return
        min_filter = input(
            "Minimum donation to challenge (<return> for none, 'q' to quit): ")
        if min_filter in ('q', 'quit'):
            return
        max_filter = input(
            "Maximum donation to challenge (<return> for none, 'q' to quit): ")
        if max_filter in ('q', 'quit'):
            return
        try:
            scenario = Donation.challenge(
                float(factor),
                float(min_filter) if min_filter else None,
                float(max_filter) if max_filter else None)
            print("\n" + scenario)
        except ValueError:
            print('Invalid inputs, try again')
        else:
            break
def send_all_letters():
    """Write thank you letters to all donors to text files, filename = <donor_name>.txt"""
    dir_name = input("Output directory ('.' for current dir): ")
    Donation.send_all_letters(dir_name)
def create_a_report():
    """Print a summary of donors and amounts donated to screen"""
    print("\n" + Donation.summary_report())
def quit_program():
    """close database, then exit program"""
    Donation.close_db()
    exit()