#!/usr/bin/env python3
import hashlib
import json
import socket
import struct
import time

from coincurve import PrivateKey

HOST = "npub15uqyclnr3er7r8uhka7f0ae2yt4gkjat8gxdan04q0e6xrnwmtjswcyla3.fips"
PORT = 8080

# Demo caller key (32 bytes). Replace with your stable caller key in real use.
PRIVKEY = bytes(range(1, 33))

params = []
body_hash = hashlib.sha256(json.dumps(params, separators=(",", ":")).encode()).hexdigest()

sk = PrivateKey(PRIVKEY)
pubkey_x = sk.public_key.format(compressed=False)[1:33].hex()
created_at = int(time.time())

tags = [
    ["nsigner_rpc", "1"],
    ["nsigner_method", "get_public_key"],
    ["nsigner_body_hash", body_hash],
]

content = "py-min"
serialized_event = json.dumps(
    [0, pubkey_x, created_at, 27235, tags, content], separators=(",", ":"), ensure_ascii=False
).encode()
event_id = hashlib.sha256(serialized_event).hexdigest()
sig = sk.sign_schnorr(bytes.fromhex(event_id), aux_randomness=b"\x00" * 32).hex()

request = {
    "id": "1",
    "method": "get_public_key",
    "params": params,
    "auth": {
        "id": event_id,
        "pubkey": pubkey_x,
        "created_at": created_at,
        "kind": 27235,
        "tags": tags,
        "content": content,
        "sig": sig,
    },
}

payload = json.dumps(request, separators=(",", ":")).encode()
frame = struct.pack(">I", len(payload)) + payload

with socket.create_connection((HOST, PORT), timeout=10) as s:
    s.sendall(frame)
    hdr = b""
    while len(hdr) < 4:
        hdr += s.recv(4 - len(hdr))
    ln = struct.unpack(">I", hdr)[0]
    body = b""
    while len(body) < ln:
        body += s.recv(ln - len(body))

print(json.loads(body.decode())["result"])
