#!/usr/bin/env python3
# Proprietary Nvidia drivers ship JSONs which specify which GPUs
# are supported by the driver. This script creates RPM provides from it.
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

import os
import json
import re
import sys

EXIT_CODE_EINPUT = 10
EXIT_CODE_PARSEERROR = 20

FILE = os.getenv("FILE")
if not FILE:
    print("Env FILE is not set! Set FILE=supported-gpus.json", file=sys.stderr)
    exit(EXIT_CODE_EINPUT)

with open(FILE, "r") as file:
    data = file.read()
try:
    array = json.loads(data)
except:
    print(f"Error decoding JSON from file {FILE}!", file=sys.stderr)
    exit(EXIT_CODE_EINPUT)

# EVR=%{version}-%{release}
EVR = os.getenv("EVR")
if not EVR:
    print("Empty package version! Set env EVR=version-release", file=sys.stderr)
    exit(EXIT_CODE_EINPUT)

# 0x1E90 -> 1e90
def dec_to_text(text):
    return re.sub("^0x", "", text).lower()

for chip in array["chips"]:
    devid = ""
    subdevid = ""
    subvendorid = ""
    name = ""
    # Skip GPUs not supported by this branch
    if "legacybranch" in chip:
        continue
    else:
        # Nvidia's JSON always specifies device ID but specifies other params not always
        name = chip["name"]
        devid = dec_to_text(chip["devid"])
        try:
            subdevid = dec_to_text(chip["subdevid"])
            subvendorid = dec_to_text(chip["subvendorid"])
        except Exception as e:
            pass

        if not devid:
            print("Device ID must not be empty!", file=sys.stderr)
            exit(EXIT_CODE_PARSEERROR)

        print(f"nvidia-blob-devid({devid}) = {EVR}")

        if subdevid:
            print(f"nvidia-blob-subdevid({subdevid}) = {EVR}")
        if subvendorid:
            print(f"nvidia-blob-subvendorid({subvendorid}) = {EVR}")
        if name:
            print(f"nvidia-blob-name({name.replace(' ', '+')}) = {EVR}")

        print(f"nvidia-blob-info()(devid={devid})(subdevid={subdevid})(subvendorid={subvendorid}) = {EVR}")
