import httpx
import sys

BASE_URL = "http://localhost:8000"

def run_e2e_verification():
    print("=== STARTING M1 END-TO-END VERIFICATION AUDIT ===")
    
    with httpx.Client(base_url=BASE_URL) as client:
        # 1. Health check
        r0 = client.get("/")
        assert r0.status_code == 200, f"Root API failed: {r0.status_code}"
        print("[OK] Step 1: Backend API running at http://localhost:8000")

        # 2. Register Tenant
        tenant_domain = "m1-e2e-shop.com"
        r1 = client.post("/api/v1/tenant/register", json={
            "domain": tenant_domain,
            "name": "M1 E2E Shop"
        })
        assert r1.status_code == 201, f"Tenant registration failed: {r1.text}"
        site_id = r1.json()["siteId"]
        print(f"[OK] Step 2: Tenant registered successfully (siteId: {site_id}, domain: {tenant_domain})")

        # 3. Session Initialization (Valid Origin)
        headers = {"Origin": f"http://{tenant_domain}"}
        r2 = client.post("/api/v1/session/init", json={"siteId": site_id}, headers=headers)
        assert r2.status_code == 201, f"Session init failed: {r2.text}"
        session_id = r2.json()["sessionId"]
        assert session_id.startswith("sess_"), "Invalid sessionId format"
        print(f"[OK] Step 3: Session initialized (sessionId: {session_id})")

        # 4. Session Initialization (Invalid Origin 403)
        bad_headers = {"Origin": "http://attacker-domain.com"}
        r3 = client.post("/api/v1/session/init", json={"siteId": site_id}, headers=bad_headers)
        assert r3.status_code == 403, f"Expected 403, got {r3.status_code}"
        print("[OK] Step 4: Invalid Origin header correctly rejected with 403 Forbidden")

        # 5. Session Initialization (Unknown siteId 404)
        r4 = client.post("/api/v1/session/init", json={"siteId": "site_unknown_000"}, headers=headers)
        assert r4.status_code == 404, f"Expected 404, got {r4.status_code}"
        print("[OK] Step 5: Unknown siteId correctly rejected with 404 Not Found")

        # 6. Message Echo (Valid Session)
        user_msg = "Hello Chatbot E2E!"
        r5 = client.post("/api/v1/message", json={
            "sessionId": session_id,
            "message": user_msg
        })
        assert r5.status_code == 200, f"Message API failed: {r5.text}"
        res_data = r5.json()
        assert res_data["sessionId"] == session_id
        assert res_data["reply"] == f"Echo: {user_msg}"
        print(f"[OK] Step 6: Message API successfully returned echo response: '{res_data['reply']}'")

        # 7. Message Echo (Unknown Session 404)
        r6 = client.post("/api/v1/message", json={
            "sessionId": "sess_invalid_999",
            "message": "Hello"
        })
        assert r6.status_code == 404, f"Expected 404, got {r6.status_code}"
        print("[OK] Step 7: Unknown sessionId correctly rejected with 404 Not Found")

        # 8. Demo Harness Verification (site_demo_123)
        demo_headers = {"Origin": "http://127.0.0.1:5500"}
        r7 = client.post("/api/v1/session/init", json={"siteId": "site_demo_123"}, headers=demo_headers)
        assert r7.status_code == 201, f"Demo session init failed: {r7.text}"
        demo_sess_id = r7.json()["sessionId"]
        
        r8 = client.post("/api/v1/message", json={
            "sessionId": demo_sess_id,
            "message": "Demo test message"
        })
        assert r8.status_code == 200 and r8.json()["reply"] == "Echo: Demo test message"
        print(f"[OK] Step 8: Demo harness site_demo_123 session init & echo message verified ({demo_sess_id})")


    print("\n=== ALL M1 END-TO-END VERIFICATION STEPS PASSED PERFECTLY ===")

if __name__ == "__main__":
    run_e2e_verification()
