#!/usr/bin/env python3
"""No-network Zoom adapter and CRM reconciliation simulator."""
import argparse
import copy
import hashlib
import json
from pathlib import Path
from urllib.parse import urlparse

def reconcile(payload):
    request = payload.get("request") or {}
    response = payload.get("provider_response") or {}
    expected = payload.get("expected_crm") or {}
    if payload.get("schema_version") != "meeting-adapter-fixture.v1":
        raise ValueError("unsupported fixture schema")
    if not payload.get("correlation_id"):
        raise ValueError("missing correlation ID")
    if request.get("item_id") != expected.get("item_id"):
        raise ValueError("CRM item mismatch")
    if response.get("provider") != "zoom_synthetic" or response.get("status") != "created":
        raise ValueError("unsupported synthetic provider response")
    parsed = urlparse(str(response.get("join_url") or ""))
    if parsed.scheme != "https" or parsed.hostname != "meeting.example.invalid":
        raise ValueError("only the non-routable training URL is allowed")
    meeting_id = str(response.get("meeting_id") or "")
    if not meeting_id:
        raise ValueError("missing synthetic meeting ID")
    return {
        "validation": "pass",
        "correlation_id": payload["correlation_id"],
        "provider_meeting_hash": "sha256:" + hashlib.sha256(meeting_id.encode()).hexdigest(),
        "mock_crm_readback": {
            "item_id": expected["item_id"],
            "zoom_status": expected["zoom_status"],
            "join_url": response["join_url"],
        },
        "external_side_effects_executed": 0,
    }

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "fixture",
        nargs="?",
        default=str(Path(__file__).with_name("zoom_meeting_response_fixture.json")),
    )
    parser.add_argument("--self-test", action="store_true")
    args = parser.parse_args()
    payload = json.loads(Path(args.fixture).read_text(encoding="utf-8"))
    result = reconcile(payload)
    if args.self_test:
        repeated = reconcile(payload)
        if repeated != result:
            raise SystemExit("self-test failed: reconciliation drifted")
        mismatch = copy.deepcopy(payload)
        mismatch["expected_crm"]["item_id"] = "wrong-item"
        try:
            reconcile(mismatch)
        except ValueError as error:
            print(json.dumps({
                "self_test": "pass",
                "stable_result": result,
                "negative_fixture": {"validation": "denied", "reason": str(error)},
            }, indent=2))
            return 0
        raise SystemExit("self-test failed: mismatched CRM item was accepted")
    print(json.dumps(result, indent=2))
    return 0

if __name__ == "__main__":
    raise SystemExit(main())
