import serial

from .device import Device


class TrezorOne(Device):
    def __init__(self, uhub_location, arduino_serial, device_port):
        super().__init__(uhub_location=uhub_location, device_port=device_port)
        self.serial = serial.Serial(arduino_serial, 9600)

    def touch(self, location, action):
        self.now()
        self.log(f"[hardware/trezor] Touching the {location} button by {action}...")
        self.serial.write(f"{location} {action}\n".encode())

    def update_firmware(self, file=None):
        if file:
            unofficial = True
            trezorctlcmd = f"firmware-update -s -f {file} &"
            self.log(f"[software] Updating the firmware to {file}")
        else:
            unofficial = False
            trezorctlcmd = "firmware-update &"
            self.log("[software] Updating the firmware to latest")
        self.wait(3)
        self._enter_bootloader()

        self.wait(3)
        self.check_model("Trezor 1 bootloader")

        self.run_trezorctl(trezorctlcmd)
        self.wait(3)
        self.touch("right", "click")
        self.wait(30)
        if unofficial:
            self.touch("right", "click")
        self.wait(10)
        self.power_off()
        self.power_on()
        if unofficial:
            self.touch("right", "click")
            self.wait(5)
            self.touch("right", "click")
        self.wait(15)
        return self.check_model("Trezor 1")

    def _enter_bootloader(self):
        self.power_off()
        self.touch("all", "press")
        self.wait(2)
        self.power_on()
        self.wait(2)
        self.touch("all", "unpress")