import urllib.request
import urllib.error
import json

# --- CONFIG ---
WORKSPACE_ID = "your-workspace-id-here"
DATASET_OLD = "your-old-dataset-id"
DATASET_NEW = "your-new-dataset-id"
ACCESS_TOKEN = "your-bearer-token"
XMLA_BASE = "https://a...content-available-to-author-only...s.net/powerbi/api/v1.0/myorg/groups/{}/datasets".format(WORKSPACE_ID)
THRESHOLD = 0.0001  # 0.01% delta

MEASURES = [
    {"name": "Total Revenue", "dax": 'EVALUATE ROW("val", [Total Revenue])'},
    {"name": "Gross Margin %", "dax": 'EVALUATE ROW("val", [Gross Margin %])'},
    {"name": "Active Customers", "dax": 'EVALUATE ROW("val", [Active Customers])'},
    {"name": "YoY Growth", "dax": 'EVALUATE ROW("val", [YoY Growth])'},
]

def query_dataset(dataset_id, dax_query):
    url = "{}/{}/executeQueries".format(XMLA_BASE, dataset_id)
    headers = {
        "Authorization": "Bearer " + ACCESS_TOKEN,
        "Content-Type": "application/json"
    }
    body = json.dumps({
        "queries": [{"query": dax_query}],
        "serializerSettings": {"includeNulls": True}
    }).encode("utf-8")
    req = urllib.request.Request(url, data=body, headers=headers, method="POST")
    try:
        with urllib.request.urlopen(req) as resp:
            data = json.loads(resp.read().decode("utf-8"))
            rows = data["results"][0]["tables"][0]["rows"]
            return rows[0]["[val]"]
    except (urllib.error.URLError, KeyError, IndexError):
        return None

def compare_measures():
    results = []
    for m in MEASURES:
        old_val = query_dataset(DATASET_OLD, m["dax"])
        new_val = query_dataset(DATASET_NEW, m["dax"])

        if old_val is None or new_val is None:
            status = "ERROR"
            delta_str = "N/A"
        else:
            try:
                old_f = float(old_val)
                new_f = float(new_val)
                if old_f == 0:
                    delta = abs(new_f)
                else:
                    delta = abs((new_f - old_f) / old_f)
                status = "MISMATCH" if delta > THRESHOLD else "OK"
                delta_str = "{:.4%}".format(delta)
            except (ValueError, TypeError):
                delta_str = "N/A"
                status = "ERROR"

        results.append({
            "measure": m["name"],
            "old": old_val,
            "new": new_val,
            "delta": delta_str,
            "status": status
        })
    return results

if __name__ == "__main__":
    print("=== DAX Measure Comparison ===\n")
    print("{:<20} {:<15} {:<15} {:<12} {}".format(
        "Measure", "Old Model", "New Model", "Delta", "Status"))
    print("-" * 75)

    rows = compare_measures()
    mismatch_count = 0
    for r in rows:
        print("{:<20} {:<15} {:<15} {:<12} {}".format(
            r["measure"],
            str(r["old"]),
            str(r["new"]),
            r["delta"],
            r["status"]))
        if r["status"] == "MISMATCH":
            mismatch_count += 1

    if mismatch_count > 0:
        print("\n! {} measure(s) exceed {:.2%} threshold".format(
            mismatch_count, THRESHOLD))
    else:
        print("\nAll measures within threshold")# your code goes here