"""DuckieDai Arc & Sector 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):
    """Require a positive finite number."""
    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 nonnegative_number(prompt):
    """Allow zero or positive finite numbers."""
    while True:
        try:
            value = float(input(prompt))

            if value >= 0 and value < 1e100:
                return value

        except ValueError:
            pass

        print("Enter 0 or greater.")


def show_answer(name, value, unit):
    print()
    print("ANSWER")
    print(name + " = " + str(value))
    print(unit)


def main():
    duckiedai_intro("ARC & SECTOR")

    print("ARC & SECTOR")
    print()
    print("s = r*theta")
    print("A = 0.5*r^2*theta")
    print()
    print("IMPORTANT:")
    print("theta is RADIANS")
    print()
    print("What do you need?")
    print()
    print("1. Arc length")
    print("2. Sector area")
    print("3. Radius from arc")
    print("4. Radius from area")
    print("5. Angle from arc")
    print("6. Angle from area")
    print()

    choice = input("Choose 1-6: ")

    print()

    # ==========================================
    # 1. ARC LENGTH
    #
    # s = r*theta
    # ==========================================

    if choice == "1":

        radius = positive_number(
            "Radius: "
        )

        theta = nonnegative_number(
            "Angle (radians): "
        )

        arc = radius * theta

        print()
        print("Using:")
        print("s = r*theta")
        print()
        print("s = " + str(radius))
        print("x " + str(theta))

        show_answer(
            "s",
            arc,
            "units"
        )

    # ==========================================
    # 2. SECTOR AREA
    #
    # A = 0.5*r^2*theta
    # ==========================================

    elif choice == "2":

        radius = positive_number(
            "Radius: "
        )

        theta = nonnegative_number(
            "Angle (radians): "
        )

        area = (
            0.5 *
            radius ** 2 *
            theta
        )

        print()
        print("Using:")
        print("A = 0.5*r^2*theta")
        print()
        print("A = 0.5 x")
        print(str(radius) + "^2")
        print("x " + str(theta))

        show_answer(
            "A",
            area,
            "square units"
        )

    # ==========================================
    # 3. RADIUS FROM ARC LENGTH
    #
    # r = s/theta
    # ==========================================

    elif choice == "3":

        arc = nonnegative_number(
            "Arc length: "
        )

        theta = positive_number(
            "Angle (radians): "
        )

        radius = arc / theta

        print()
        print("Using:")
        print("s = r*theta")
        print()
        print("Rearranged:")
        print("r = s/theta")

        show_answer(
            "r",
            radius,
            "units"
        )

    # ==========================================
    # 4. RADIUS FROM SECTOR AREA
    #
    # r = sqrt(2A/theta)
    # ==========================================

    elif choice == "4":

        area = nonnegative_number(
            "Sector area: "
        )

        theta = positive_number(
            "Angle (radians): "
        )

        radius = sqrt(
            (2 * area) /
            theta
        )

        print()
        print("Using:")
        print("A = 0.5*r^2*theta")
        print()
        print("Rearranged:")
        print("r = sqrt(2A/theta)")

        show_answer(
            "r",
            radius,
            "units"
        )

    # ==========================================
    # 5. ANGLE FROM ARC LENGTH
    #
    # theta = s/r
    # ==========================================

    elif choice == "5":

        arc = nonnegative_number(
            "Arc length: "
        )

        radius = positive_number(
            "Radius: "
        )

        theta = arc / radius

        print()
        print("Using:")
        print("s = r*theta")
        print()
        print("Rearranged:")
        print("theta = s/r")

        show_answer(
            "theta",
            theta,
            "radians"
        )

    # ==========================================
    # 6. ANGLE FROM SECTOR AREA
    #
    # theta = 2A/r^2
    # ==========================================

    elif choice == "6":

        area = nonnegative_number(
            "Sector area: "
        )

        radius = positive_number(
            "Radius: "
        )

        theta = (
            2 * area /
            (radius ** 2)
        )

        print()
        print("Using:")
        print("A = 0.5*r^2*theta")
        print()
        print("Rearranged:")
        print("theta = 2A/r^2")

        show_answer(
            "theta",
            theta,
            "radians"
        )

    else:
        print("Invalid choice.")

    print()
    print("DuckieDai says: done!")


# TI-Python imports the selected AppVar rather than
# setting __name__ to main.
main()
