"""DuckieDai Point-Line Distance 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 number(prompt):
    """Allow positive, negative, or zero values."""
    while True:
        try:
            value = float(input(prompt))

            if value > -1e100 and value < 1e100:
                return value

        except ValueError:
            pass

        print("Enter a valid number.")


def get_line():
    """Get valid coefficients for Ax + By + C = 0."""
    while True:
        print("LINE:")
        print("Ax + By + C = 0")
        print()

        A = number("A: ")
        B = number("B: ")
        C = number("C: ")

        if A != 0 or B != 0:
            return A, B, C

        print()
        print("INVALID LINE")
        print("A and B cannot")
        print("both be zero.")
        print()


def point_line_distance(A, B, C, x0, y0):
    """Return perpendicular distance from point to line."""

    numerator = abs(
        A * x0 +
        B * y0 +
        C
    )

    denominator = sqrt(
        A ** 2 +
        B ** 2
    )

    distance = numerator / denominator

    return numerator, denominator, distance


def main():
    duckiedai_intro("POINT-LINE DIST")

    print("POINT TO LINE")
    print("DISTANCE")
    print()
    print("Line form:")
    print("Ax + By + C = 0")
    print()
    print("Formula:")
    print("|A*x0+B*y0+C|")
    print("----------------")
    print("sqrt(A^2+B^2)")
    print()

    A, B, C = get_line()

    print()
    print("POINT (x0, y0)")
    print()

    x0 = number("x0: ")
    y0 = number("y0: ")

    numerator, denominator, distance = \
        point_line_distance(
            A, B, C, x0, y0
        )

    print()
    print("Using:")
    print("d = |A*x0+B*y0+C|")
    print("    /sqrt(A^2+B^2)")
    print()

    print("Top =")
    print(str(numerator))
    print()

    print("Bottom =")
    print(str(denominator))
    print()

    print("ANSWER")
    print("Distance =")
    print(str(distance))
    print("units")

    if distance == 0:
        print()
        print("Point lies on")
        print("the line.")

    print()
    print("DuckieDai says: done!")


# TI-Python imports the selected AppVar rather than
# setting __name__ to main.
main()
