"""
trade_event_server.py
---------------------
A minimal HTTP server that receives JSON trade events posted by the
TradeEventStreamer EA and prints them to stdout.

Requirements: Python 3.7 or later (standard library only)
Usage:        python trade_event_server.py [port]

The server listens on 127.0.0.1 (loopback only) to accept connections
from MetaTrader 5 running on the same machine. Binding to 127.0.0.1
rather than 0.0.0.0 means the port is not reachable from the network,
which reduces exposure if the server is left running.

Every POST to /trade_event is expected to carry a JSON body. The body
is parsed and written to stdout with a timestamp prefix. A 200 OK
response is sent regardless of parse success so the EA's HTTP POST
always gets a completion signal rather than timing out.
"""

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


class TradeEventHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        length = int(self.headers.get("Content-Length", 0))
        raw = self.rfile.read(length)

        timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]

        try:
            event = json.loads(raw.decode("utf-8"))
            event_type = event.get("event", "UNKNOWN")
            symbol     = event.get("symbol", "?")
            ticket     = event.get("ticket") or event.get("deal_ticket", "?")

            print(f"[{timestamp}] {event_type:12s}  symbol={symbol:<12s} ticket={ticket}")

            if event_type == "TRADE_OPEN":
                print(f"  type={event.get('type')}  volume={event.get('volume')}"
                      f"  price={event.get('price')}"
                      f"  sl={event.get('sl')}  tp={event.get('tp')}"
                      f"  magic={event.get('magic')}")
            elif event_type == "TRADE_CLOSE":
                net = (event.get('profit', 0) +
                       event.get('swap', 0) +
                       event.get('commission', 0))
                print(f"  type={event.get('type')}  volume={event.get('volume')}"
                      f"  open={event.get('open_price')}  close={event.get('close_price')}"
                      f"  profit={event.get('profit')}  net={net:.2f}"
                      f"  magic={event.get('magic')}")
        except (json.JSONDecodeError, UnicodeDecodeError) as e:
            print(f"[{timestamp}] PARSE ERROR: {e}  raw={raw!r}")

        # Always reply 200 so the EA does not treat a parse error as a delivery failure
        response = json.dumps({"status": "ok"}).encode()
        self.send_response(200)
        self.send_header("Content-Type", "application/json")
        self.send_header("Content-Length", str(len(response)))
        self.end_headers()
        self.wfile.write(response)

    def log_message(self, fmt, *args):
        # Suppress the default per-request access log
        pass


def main():
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8787
    server = HTTPServer(("127.0.0.1", port), TradeEventHandler)
    print(f"Trade event server listening on http://127.0.0.1:{port}/trade_event")
    print("Press Ctrl+C to stop.\n")
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nServer stopped.")


if __name__ == "__main__":
    main()
