""" Week12-2 Notes """

import random

def randomDistance():
    die1 = random.randint(1, 6)
    die2 = random.randint(1, 6)
    return die1 + die2

def getExpectedValue(numTrials):
    total = 0
    for trial in range(numTrials):
        result = randomDistance()
        total += result
    return total / numTrials

###

def getExpectedValue(numTrials):
    count = 0
    for trial in range(numTrials):
        result = randomDistance()
        if result >= 10:
            count += 1
    return count / numTrials

###

def makeModel(data):
    # Set up your simulation components here, by setting
    # data["compName"] = component
    data["color"] = "red"
    data["tmp"] = ""
    data["cx"] = 200
    data["cy"] = 200

def makeView(data, canvas):
    # Write your simulation view here, using the Tkinter canvas
    canvas.create_oval(data["cx"] - 50, data["cy"] - 50, data["cx"] + 50, data["cy"] + 50, fill=data["color"])

def runRules(data, call):
    # Write your simulation rules here, by changing data
    pass

def keyPressed(data, event):
    print(event)
    # Use event.char to get the character pressed
    if event.keysym == "Return":
        data["color"] = data["tmp"]
        data["tmp"] = ""
    elif event.keysym == "BackSpace":
        data["tmp"] = data["tmp"][:len(data["tmp"])-1]
    else:
        data["tmp"] = data["tmp"] + event.char
    print(data["tmp"])

def mousePressed(data, event):
    # Use event.x and event.y to get the (x,y) location of the clicked pixel
    distance = ((data["cx"] - event.x)**2 + (data["cy"] - event.y)**2)**0.5
    if distance <= 50:
        colors = ["red", "orange", "yellow", "green", "blue", "purple"]
        myColor = random.choice(colors)
        data["color"] = myColor

# You do not need to be able to write the following functions;
# just modify the five functions above.

from tkinter import *

def timeLoop(data, canvas, call):
    runRules(data, call)

    canvas.delete(ALL)
    makeView(data, canvas)
    canvas.update()

    canvas.after(data["timeRate"], timeLoop, data, canvas, call + 1)

def keyEventHandler(data, canvas, event):
    keyPressed(data, event)

    canvas.delete(ALL)
    makeView(data, canvas)
    canvas.update()

def mouseEventHandler(data, canvas, event):
    mousePressed(data, event)

    canvas.delete(ALL)
    makeView(data, canvas)
    canvas.update()

def runSimulation(w, h, timeRate):
    data = { }
    data["timeRate"] = int(timeRate * 1000) # call will be in ms
    makeModel(data)

    root = Tk()
    canvas = Canvas(root, width=w, height=h)
    canvas.configure(bd=0, highlightthickness=0)
    canvas.pack()
    makeView(data, canvas)

    canvas.after(data["timeRate"], timeLoop, data, canvas, 1)

    root.bind("<Key>", lambda event : keyEventHandler(data, canvas, event))
    root.bind("<Button-1>", lambda event : mouseEventHandler(data, canvas, event))

    root.mainloop()

runSimulation(400, 400, 0.1)