"""DuckieDai Universal Gravitation for TI-84 Plus CE Python."""

from math import sqrt


def duckiedai_intro(program_name, wait=True):
    """Show the reusable DuckieDai program opening."""
    title = program_name[:16]
    empty = 16 - len(title)
    left = empty // 2
    right = empty - left

    print("+----------------------+")
    print("|   " + " " * left + title + " " * right + "   |")
    print("|                      |")
    print("|       __             |")
    print("|   ___(o )>  quack!   |")
    print("|   \\ <_. )           |")
    print("|    `---'             |")
    print("|     by DuckieDai     |")
    print("+----------------------+")
    print("Loading...")

    if wait:
        input("Press enter to start ")
        print("\n" * 6)


def positive_number(prompt):
    """Ask until a positive finite number is entered."""
    while True:
        try:
            value = float(input(prompt))

            if value > 0 and value < 1e100:
                return value

        except ValueError:
            pass

        print("Enter a number above 0.")


def show_answer(name, value, unit):
    input("Press enter for answer ")
    print("\n" * 6)
    print("ANSWER")
    print(name + " = " + str(value))
    print(unit)


def main():
    duckiedai_intro("UNIVERSAL GRAV")

    G = 6.674e-11

    print("UNIVERSAL GRAVITY")
    print()
    print("Formula:")
    print("Fg = G*m1*m2/r^2")
    print()
    print("G = 6.674E-11")
    input("Press enter for menu ")
    print("\n" * 6)
    print()
    print("What do you need?")
    print()
    print("1. Gravity force")
    print("2. Mass 1")
    print("3. Mass 2")
    print("4. Distance")
    print()

    choice = input("Choose 1-4: ")

    print()

    # ==========================================
    # 1. SOLVE GRAVITATIONAL FORCE
    #
    # Fg = G*m1*m2/r^2
    # ==========================================

    if choice == "1":

        m1 = positive_number("Mass 1 (kg): ")
        m2 = positive_number("Mass 2 (kg): ")
        r = positive_number("Distance (m): ")

        force = (
            G * m1 * m2 /
            (r ** 2)
        )

        print()
        print("Using:")
        print("Fg = G*m1*m2/r^2")
        print()
        print("Fg =")
        print(str(G) + " x")
        print(str(m1) + " x")
        print(str(m2))
        print("/ " + str(r) + "^2")

        show_answer(
            "Fg",
            force,
            "newtons"
        )

    # ==========================================
    # 2. SOLVE MASS 1
    #
    # m1 = Fg*r^2 / (G*m2)
    # ==========================================

    elif choice == "2":

        force = positive_number("Gravity force (N): ")
        m2 = positive_number("Mass 2 (kg): ")
        r = positive_number("Distance (m): ")

        m1 = (
            force * r ** 2 /
            (G * m2)
        )

        print()
        print("Using:")
        print("Fg = G*m1*m2/r^2")
        print()
        print("Rearranged:")
        print("m1 = Fg*r^2")
        print("     /(G*m2)")

        show_answer(
            "m1",
            m1,
            "kg"
        )

    # ==========================================
    # 3. SOLVE MASS 2
    #
    # m2 = Fg*r^2 / (G*m1)
    # ==========================================

    elif choice == "3":

        force = positive_number("Gravity force (N): ")
        m1 = positive_number("Mass 1 (kg): ")
        r = positive_number("Distance (m): ")

        m2 = (
            force * r ** 2 /
            (G * m1)
        )

        print()
        print("Using:")
        print("Fg = G*m1*m2/r^2")
        print()
        print("Rearranged:")
        print("m2 = Fg*r^2")
        print("     /(G*m1)")

        show_answer(
            "m2",
            m2,
            "kg"
        )

    # ==========================================
    # 4. SOLVE DISTANCE
    #
    # r = sqrt(G*m1*m2/Fg)
    # ==========================================

    elif choice == "4":

        force = positive_number("Gravity force (N): ")
        m1 = positive_number("Mass 1 (kg): ")
        m2 = positive_number("Mass 2 (kg): ")

        r = sqrt(
            G * m1 * m2 /
            force
        )

        print()
        print("Using:")
        print("Fg = G*m1*m2/r^2")
        print()
        print("Rearranged:")
        print("r = sqrt(")
        print("G*m1*m2/Fg)")

        show_answer(
            "r",
            r,
            "meters"
        )

    else:
        print("Invalid choice.")

    print()
    print("DuckieDai says: done!")


# TI-Python imports the selected AppVar rather than
# setting __name__ to main.
main()
