"""DuckieDai Cubic Zero Solver for TI-84 Plus CE Python."""

from math import sqrt


def duckiedai_intro(program_name, wait=True):
    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("| hiddenwordscanner.com|")
    print("+----------------------+")
    print("Loading...")

    if wait:
        input("Press enter to start ")
        print("\n" * 8)


def clear_screen():
    print("\n" * 8)


def clean_num(n):
    if abs(n - round(n)) < 0.0000001:
        return int(round(n))
    return round(n, 6)


def quadratic_solver(a, b, c):
    disc = b * b - 4 * a * c

    # SCREEN 3
    clear_screen()

    print("QUADRATIC")
    print("---------")
    print(clean_num(a), "x^2")
    print(clean_num(b), "x")
    print(clean_num(c))

    print("")
    print("Discriminant:")
    print(clean_num(disc))

    input("\nPress enter ")

    # SCREEN 4
    clear_screen()

    print("OTHER ROOTS")
    print("-----------")

    if abs(disc) < 0.0000001:
        x = -b / (2 * a)

        print("One repeated root:")
        print(clean_num(x))

    elif disc > 0:
        x1 = (-b + sqrt(disc)) / (2 * a)
        x2 = (-b - sqrt(disc)) / (2 * a)

        print("x1 =", clean_num(x1))
        print("x2 =", clean_num(x2))

        print("")
        print("Exact form:")
        print(clean_num(-b), "+/-")
        print("sqrt(", clean_num(disc), ")")
        print("over", clean_num(2 * a))

    else:
        real = -b / (2 * a)
        imag = sqrt(-disc) / abs(2 * a)

        print("Complex roots:")
        print(clean_num(real), "+")
        print(clean_num(imag), "i")
        print("")
        print(clean_num(real), "-")
        print(clean_num(imag), "i")

    input("\nPress enter ")


def number(prompt):
    text = input(prompt)

    if "/" in text:
        parts = text.split("/")
        return float(parts[0]) / float(parts[1])

    return float(text)


def run_test():
    clear_screen()

    print("ENTER CUBIC")
    print("ax^3+bx^2+cx+d")
    print("")

    a = float(input("x^3: "))
    b = float(input("x^2: "))
    c = float(input("x: "))
    d = float(input("Const: "))

    print("")
    print("Test zero")
    print("Use decimal if frac")
    zero = number("Zero: ")

    first = a
    second = b + first * zero
    third = c + second * zero
    remainder = d + third * zero

    # Fix tiny floating errors
    if abs(remainder) < 0.0000001:
        remainder = 0

    # SCREEN 1
    clear_screen()

    print("ZERO TEST")
    print("---------")
    print("Test:", clean_num(zero))
    print("R:", clean_num(remainder))
    print("")

    if remainder == 0:
        print("TRUE!")
        print("IT IS A ZERO")
    else:
        print("FALSE")
        print("NOT A ZERO")

    input("\nPress enter ")

    # If false, stop here
    if remainder != 0:
        return

    # SCREEN 2
    clear_screen()

    print("QUOTIENT")
    print("--------")
    print(clean_num(first), "x^2")
    print(clean_num(second), "x")
    print(clean_num(third))

    print("")
    print("Next:")
    print("Quadratic formula")

    input("\nPress enter ")

    # AUTOMATICALLY SOLVE QUADRATIC
    quadratic_solver(first, second, third)

    # FINAL SCREEN
    clear_screen()

    print("ALL ROOTS")
    print("---------")
    print("First root:")
    print(clean_num(zero))
    print("")
    print("Other 2 shown")
    print("on last screen")


duckiedai_intro("Cubic Solver")

while True:
    run_test()

    print("")
    again = input("Again? y/n: ")

    if again.lower() != "y":
        break


clear_screen()
print("DuckieDai says: done!")
