import json, os, ssl, sys, urllib.parse, urllib.request, urllib.error


def _cfg():
    return json.loads(os.environ.get("INTEGRATION_SECRETS", "{}"))


def _ctx():
    if _cfg().get("insecure"):
        c = ssl.create_default_context()
        c.check_hostname = False
        c.verify_mode = ssl.CERT_NONE
        return c
    return None


def request(method, path, body=None):
    cfg = _cfg()
    url = str(cfg.get("server_url") or "").rstrip("/") + path
    data = json.dumps(body).encode("utf-8") if body is not None else None
    headers = {"Accept": "application/json", "Content-Type": "application/json",
               "Authorization": str(cfg.get("api_key") or "")}
    req = urllib.request.Request(url, data=data, headers=headers, method=method)
    with urllib.request.urlopen(req, timeout=90, context=_ctx()) as r:
        raw = r.read()
        return json.loads(raw) if raw else {}


split = lambda s: [t.strip() for t in str(s or "").split(",") if t.strip()]


def main():
    inputs = json.loads(os.environ.get("INTEGRATION_INPUTS", "{}"))
    value = inputs.get("value")
    type_ = inputs.get("type")
    tags = inputs.get("tags")
    limit = inputs.get("limit")
    filter_json = inputs.get("filter_json")

    body = {"returnFormat": "json", "limit": limit or 25}
    if value:
        body["value"] = value
    if type_:
        body["type"] = type_
    tags_list = split(tags)
    if tags_list:
        body["tags"] = tags_list
    if filter_json:
        extra = json.loads(filter_json)
        if not isinstance(extra, dict):
            raise Exception("filter_json must be a JSON object")
        body.update(extra)

    res = request("POST", "/events/restSearch", body)
    print(json.dumps(res))


try:
    main()
except urllib.error.HTTPError as e:
    print(json.dumps({"error": "HTTP " + str(e.code), "detail": e.read().decode("utf-8", "replace")}))
    sys.exit(1)
except Exception as e:
    print(json.dumps({"error": str(e)}))
    sys.exit(1)
