import json
import socket
from http.server import BaseHTTPRequestHandler, HTTPServer
from datetime import datetime

import os

import websockets

if os.path.exists('post_data.txt'):
    os.remove('post_data.txt')

with open('post_data.txt', 'a') as file:
    file.write(f'timestamp,latency\n')

machine_ip = socket.gethostbyname(socket.gethostname())

HOST = machine_ip
PORT = "5000"

request = {
    "action": "test"
}


async def forward_to_websocket(payload):
    async with websockets.connect(f"ws://{HOST}:{PORT}") as websocket:
        request['data'] = payload
        j = json.dumps(request)
        await websocket.send(j)
    pass


class RequestHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        current_time = datetime.now().isoformat()
        # delete the file if it exists

        with open('post_data.txt', 'a') as file:
            # file.write(f'{current_time}: {post_data.decode("utf-8")}\n')
            j = post_data.decode("utf-8")
            payload = json.loads(j)
            send_time = payload['payloads'][0]['events'][0]['timestamp']
            elapsed_time = datetime.strptime(current_time, "%Y-%m-%dT%H:%M:%S.%f") - datetime.strptime(send_time,
                                                                                                       "%Y-%m-%dT%H:%M:%SZ")

            forward_to_websocket(payload)
            print(j)

            elapsed_time = f"{elapsed_time.seconds}.{elapsed_time.microseconds}"
            file.write(f'{current_time},{elapsed_time}\n')
            print(
                f'sent: {send_time} received: {current_time}; Elapsed: {elapsed_time} seconds')

        self.send_response(200)
        self.end_headers()


def run(server_class=HTTPServer, handler_class=RequestHandler, port=8001):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Starting httpd on port {port}...')
    httpd.serve_forever()


if __name__ == '__main__':
    run()
