"""
Dark Broken Key Python SDK — wraps the Dark Broken Key Client API v1 (POST /api/v1).
No third-party dependencies (urllib only). Python 3.8+.

Setup: set BASE_URL to your Dark Broken Key site origin, and NAME / OWNERID to the
credentials shown in your dashboard (Overview -> Credentials).
"""
import json
import urllib.request

BASE_URL = "https://your-site.pages.dev"  # <-- your Dark Broken Key deployment
NAME = "MyApp"                            # <-- your application name
OWNERID = "YOUR_OWNER_ID"                 # <-- your developer owner ID
VERSION = "1.0"                           # <-- your application version


class DarkBrokenKeyError(Exception):
    pass


class DarkBrokenKey:
    def __init__(self, name=NAME, ownerid=OWNERID, version=VERSION, base_url=BASE_URL):
        self.name = name
        self.ownerid = ownerid
        self.version = version
        self.base_url = base_url.rstrip("/")
        self.sessionid = None

    def _call(self, type_, **fields):
        payload = {"type": type_, "name": self.name, "ownerid": self.ownerid}
        payload.update(fields)
        req = urllib.request.Request(
            self.base_url + "/api/v1",
            data=json.dumps(payload).encode("utf-8"),
            headers={"Content-Type": "application/json"},
            method="POST",
        )
        with urllib.request.urlopen(req, timeout=15) as resp:
            data = json.loads(resp.read().decode("utf-8"))
        if not data.get("success"):
            raise DarkBrokenKeyError(data.get("message", "Unknown error"))
        if data.get("sessionid"):
            self.sessionid = data["sessionid"]
        return data

    def init(self):
        """Handshake + version check. Call this before anything else."""
        return self._call("init", version=self.version)

    def register(self, username, password, key, hwid=""):
        """Create an end-user account by consuming a license key."""
        return self._call("register", username=username, **{"pass": password}, key=key, hwid=hwid)

    def login(self, username, password, hwid=""):
        """Log in with username + password (HWID lock enforced)."""
        return self._call("login", username=username, **{"pass": password}, hwid=hwid)

    def license(self, key, hwid=""):
        """Key-only login. Unused keys are activated on first use."""
        return self._call("license", key=key, hwid=hwid)

    def check(self):
        """Validate the current session (also re-checks ban/expiry)."""
        return self._call("check", sessionid=self.sessionid or "")

    def var(self, varid):
        """Fetch a server-side variable by name (requires a valid session)."""
        data = self._call("var", sessionid=self.sessionid or "", varid=varid)
        return data["info"]["value"]


if __name__ == "__main__":
    app = DarkBrokenKey()
    app.init()
    app.login("username", "password", hwid="YOUR-HWID-HERE")
    print("Logged in, session:", app.sessionid)
    print("welcome var:", app.var("welcome"))
