import http.server
import socketserver
import json
import urllib.parse

PORT = 8000
rooms = {} # Stores game states in memory

class ChessAPIHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path.startswith('/api/room'):
            query = urllib.parse.parse_qs(urllib.parse.urlparse(self.path).query)
            code = query.get('code', [''])[0]
            
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Access-Control-Allow-Origin', '*')
            self.end_headers()
            
            self.wfile.write(json.dumps(rooms.get(code, {})).encode('utf-8'))
        else:
            super().do_GET() # Serve the static chess HTML page

    def do_POST(self):
        if self.path.startswith('/api/room'):
            length = int(self.headers.get('Content-Length', 0))
            data = json.loads(self.rfile.read(length).decode('utf-8'))
            
            code = data.get('code')
            if code:
                if code not in rooms: rooms[code] = {}
                rooms[code].update(data) # Merge updates like FEN, names, resignations
                
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.send_header('Access-Control-Allow-Origin', '*')
            self.end_headers()
            self.wfile.write(json.dumps({'status': 'ok'}).encode('utf-8'))
        else:
            self.send_error(404)

# Threading is required so browsers polling at the same time don't block each other
class ThreadedHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    pass

if __name__ == '__main__':
    with ThreadedHTTPServer(("", PORT), ChessAPIHandler) as httpd:
        print(f"Relay Server running on port {PORT}")
        httpd.serve_forever()
