from invoke import task

from datetime import datetime as dt
import os

HOME = os.path.expanduser('~')
TODAY = dt.now().strftime('%Y.%m.%d')

# Examples for CardputerAdv
DEVICE = 'Espressif'
PORT='/dev/ttyACM0' # Linux
CHIP='ESP32-S3'
# PORT='COM0' # Windows
MICROPYTHON=f'$HOME/Downloads/ESP32_GENERIC_S3-20260406-v1.28.0.bin'
# MicroPython version 
# from 
# https://micropython.org/download/ESP32_GENERIC_S3/

@task
def help(c):
    '''
    On using this tasks file

    - Set the Cardputer Adv power to 'off' state
    - Plugging in to USB will cause it to boot
    - Hold 'Go' while booting
    - Hold 'Go' and press 'Reset' to try again.
    - On success, the usual screen content still shows up
    > Tip: Be sure to use a cable that can carry data, not just power.

    Consider burnin
    https://github.com/echo-lalia/MicroHydra

    '''
    print(help.__doc__)

@task
def groups(c):
    '''Check that the current user is a member of dialout'''
    result = c.run(f'groups {os.getlogin()}')
    assert 'dialout' in result.stdout
    print('ok')

@task
def usbdiff(c):
    '''Use lsusb to try to find the new device.'''
    input('Un-plug in the device...')
    c.run('lsusb > /tmp/before.txt')
    input('Plug in the device...')
    c.run('lsusb > /tmp/after.txt')
    result = c.run('diff /tmp/before.txt /tmp/after.txt')
    print(result.stdout)
    # breakpoint()

# Maybe https://thelastoutpostworkshop.github.io/ESPConnect/ in Chromium?


@task
def check_conn(c):
    result = c.run(f'lsusb | grep {DEVICE}')
    assert DEVICE in result.stdout
    print('[ok]')

@task
def listusb(c):
    # result = c.run('ls /dev/ttyACM*')
    result = c.run(f'ls {PORT}')
    assert result.ok
    print('[ok]')
    # c.run('ls /dev/ttyUSB*')

@task
def chip_id(c):
    result = c.run(f'esptool --port {PORT} chip-id')
    assert CHIP in result.stdout
    print('[ok]')

@task
def check_all(c):
    listusb(c)
    check_conn(c)
    chip_id(c)

@task
def erase_flash(c):
    '''Erasing flash is recommended before flashing fresh.'''
    c.run(f'esptool --port {PORT} erase-flash')

@task
def write_flash(c, filepath=MICROPYTHON):
    '''Write flash - defaults to MicroPython

    Requires .bin file from micropython.org
    '''
    c.run(f'esptool --chip {CHIP} --port {PORT} --baud 460800 write-flash -z 0x1000 {filepath}')



