import asyncio
import json
import socket
import sys

import websockets
from pyfzf.pyfzf import FzfPrompt

# fzf = FzfPrompt()

from test_suite import pixel, ACTION_FIRMWARE_UPDATE_START, ACTION_FIRMWARE_UPDATE_PROGRESS, ACTION_FIRMWARE_UPDATE_END

device = pixel

pi_ip = "192.168.86.38"
machine_ip = socket.gethostbyname(socket.gethostname())

HOST = machine_ip
PORT = "8080"
BUFFER_SIZE = 1024

file_path = sys.argv[1]
assert len(sys.argv) > 1, "Please provide a file path as an argument."

# argument to filename
# filename =
async def main(fzf_ops='--height 40% --layout reverse --info inline --border'):
    async with websockets.connect(f"ws://{HOST}:{PORT}") as websocket:
        file_name = file_path.split("/")[-1]
        # filename = '23381.png'
        f = open(file_path, 'rb')

        data = {"fileName": file_name, "size": 0}

        request = {
            "sender": str(device),
            "receiver": str(device),
            "action": str(ACTION_FIRMWARE_UPDATE_START),
            "data": data
        }

        await websocket.send(json.dumps(request))
        while True:
            chunck = f.read(BUFFER_SIZE)
            while chunck:
                data = {"fileName": file_name, "data": list(chunck)}
                request = {
                    "sender": str(device),
                    "receiver": str(device),
                    "action": str(ACTION_FIRMWARE_UPDATE_PROGRESS),
                    "data": data
                }

                await websocket.send(json.dumps(request))
                chunck = f.read(BUFFER_SIZE)
            if not chunck:
                f.close()
                request = {
                    "sender": str(device),
                    "receiver": str(device),
                    "action": str(ACTION_FIRMWARE_UPDATE_END),
                    "data": {"fileName": file_name, "size": 0}
                }
                await websocket.send(json.dumps(request))
                await websocket.close()

        query_results = await websocket.recv()
        print(f">>> {str(json.dumps(query_results, indent=4, sort_keys=True))}")
        # query_results = await websocket.recv()
        # results = json.loads(json.loads(query_results))["data"]
        # rsplit = results.split("\n")
        # row = fzf.prompt(rsplit, fzf_options=fzf_ops)
        # print(str(row))

        # print(f">>> {str(json.dumps(results, indent=4, sort_keys=True))}")


if __name__ == "__main__":
    asyncio.run(main())
