#!/usr/bin/env python3
"""Release an OTA upload and demote old ones (German server).

Usage:
    python ota_release.py <upload-id>
    python ota_release.py 6a3382d3303e888533ff2891

Gets JWT, releases the upload, demotes all other released uploads to obsolete.
"""
import sys, json
from urllib.request import Request, urlopen
from urllib.error import HTTPError

BASE = "https://ota.46-4-121-190.sslip.io"
ADMIN_USER = "admin"
ADMIN_PASS = "353fde0a0fe4e8a0b2799e54"

def api(method, path, data=None, token=None):
    headers = {"Content-Type": "application/json"}
    if token:
        headers["Authorization"] = f"Bearer {token}"
    body = json.dumps(data).encode() if data else None
    req = Request(f"{BASE}{path}", data=body, headers=headers, method=method)
    with urlopen(req) as r:
        return json.loads(r.read())

def main():
    if len(sys.argv) < 2:
        print("Usage: python ota_release.py <upload-id>")
        sys.exit(1)

    new_id = sys.argv[1]

    # Get JWT
    r = api("POST", "/authentication", {"strategy": "local", "username": ADMIN_USER, "password": ADMIN_PASS})
    token = r["accessToken"]

    # Release new upload
    r = api("PATCH", f"/uploads/{new_id}", {"status": "released"}, token)
    print(f"Released: {r.get('status')} ({new_id})")

    # Demote old released uploads
    uploads = api("GET", "/uploads", token=token)
    for u in uploads:
        if u["_id"] != new_id and u.get("status") == "released":
            api("PATCH", f"/uploads/{u['_id']}", {"status": "obsolete"}, token)
            print(f"Demoted: {u['_id']} ({u.get('gitCommit', '?')[:40]})")

    print("Done!")

if __name__ == "__main__":
    main()
