import cv2 as cv
from mss import mss
import numpy as np
from time import sleep, time
import pyautogui as inp
from matplotlib import pyplot as plt

import sys

np.set_printoptions(threshold=sys.maxsize)

inp.sleep(10)

img = 0

dino_rel_x = 35
dino_rel_y = 101

start_trig_x = dino_rel_x + 68
trig_x = start_trig_x
trig_y_high = dino_rel_y - 7
trig_y_low = dino_rel_y + 25
start_hold_coeff = 1000
hold_coeff = start_hold_coeff


def hold_key(key, hold_time):
    inp.hold(key, hold_time)


cv.namedWindow("opencv")

with mss() as sct:
    monitor = {"top": 0, "left": 0, "width": 2560, "height": 1440}

    dino_img = cv.imread("dino-u.png")
    dino_img = cv.cvtColor(dino_img, cv.COLOR_RGB2GRAY)

    img = np.array(sct.grab(monitor))
    img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)

    t_min_val, t_max_val, t_min_loc, t_max_loc = cv.minMaxLoc(
        cv.matchTemplate(img, dino_img, cv.TM_SQDIFF_NORMED)
    )

    print(t_min_val, t_max_val, t_min_loc, t_max_loc)

    monitor = {
        "top": t_min_loc[1] - 94,
        "left": t_min_loc[0] - 4,
        "width": 300,
        "height": 153,
    }

    start_time = time()

    inp.press("space")

    while True:
        trig_x = np.clip(int(start_trig_x + (time() - start_time) / 2), 0, 152)

        img = np.array(sct.grab(monitor))
        img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
        _, img = cv.threshold(img, 127, 255, cv.THRESH_BINARY_INV)

        low_trig = np.any(img[trig_y_low, trig_x - 25 : trig_x])

        high_trig = np.any(img[trig_y_high, trig_x - 10 : trig_x])

        if cv.waitKey(1) == ord("q"):
            cv.destroyAllWindows()
            break

        if low_trig:
            left = 9999
            right = 0
            for x in range(trig_x - 10, trig_x + 100):
                if img[trig_y_low - 1 : trig_y_low + 1, x].max() == 0:
                    continue
                if x < left:
                    left = x
                if x > right:
                    right = x
            ln = (right - left) * 20 / (hold_coeff + (time() - start_time) * 40)
            if high_trig:
                ln += 0.1
                print("hi-cac")
            if ln < 0:
                print("xx")
                ln = 0.2
            print("cactus/low-bird", left - trig_x, right - trig_x, right - left, ln)
            inp.press("up")
            sleep(ln / 4)
            inp.keyDown("down")
            sleep(0.03)
            inp.keyUp("down")
        elif high_trig:
            print("bird")
            inp.keyDown("down")
            sleep(0.15)
            inp.keyUp("down")
        else:
            pass

        # high-box
        img = cv.rectangle(
            img, (trig_x - 10, trig_y_high), (trig_x, trig_y_high), (255, 0, 0), 1
        )

        # low-trig
        img = cv.rectangle(
            img, (trig_x - 25, trig_y_low), (trig_x, trig_y_low), (255, 0, 0), 1
        )
        # low-box
        img = cv.rectangle(
            img,
            (trig_x - 10, trig_y_low - 5),
            (trig_x + 100, trig_y_low),
            (255, 0, 0),
            1,
        )

        cv.imshow("opencv", img)
