# AI-Decision-Receipt v1 reference parser and checker. Apache-2.0. https://sebbi.pro/standard/ai-decision-receipt
import re
HEX64 = re.compile(r"^[0-9a-f]{64}$")


def parse(value):
    """Return a dict of members from an AI-Decision-Receipt header value."""
    out, i, s = {}, 0, value.strip()
    if s.lower().startswith("ai-decision-receipt:"):
        s = s.split(":", 1)[1].strip()
    while i < len(s):
        while i < len(s) and s[i] in " \t,":
            i += 1
        m = re.match(r"[a-z*][a-z0-9_\-.*]*", s[i:])
        if not m:
            raise ValueError("bad key")
        k = m.group(0); i += len(k); v = True
        if i < len(s) and s[i] == "=":
            i += 1
            if s[i] == '"':
                j = i + 1; buf = []
                while s[j] != '"':
                    if s[j] == "\\":
                        j += 1
                    buf.append(s[j]); j += 1
                v = "".join(buf); i = j + 1
            else:
                raw = re.match(r"[^,\s]+", s[i:]).group(0); i += len(raw)
                v = int(raw) if re.match(r"^-?\d+$", raw) else float(raw) if re.match(r"^-?\d+\.\d+$", raw) else raw
        if k in out:
            raise ValueError("duplicate key " + k)
        out[k] = v
    return out


def conformant(value):
    try:
        d = parse(value)
    except ValueError:
        return False
    return (d.get("v") == 1 and isinstance(d.get("issuer"), str) and bool(re.match(r"^[A-Z][A-Z0-9_]*$", str(d.get("decision", ""))))
            and isinstance(d.get("block"), int) and d["block"] >= 0 and bool(HEX64.match(str(d.get("seal", ""))))
            and str(d.get("verify", "")).startswith("https://") and ("req" not in d or bool(HEX64.match(str(d["req"])))))
