"""
Add custom domains to Netlify sites via API.
Step 1 of DNS configuration: tell Netlify which custom domains each site should serve.
"""

import json
import re
import sys
import time
import httpx

NETLIFY_TOKEN = "nfc_GEESomrqecnQfRMRPhgDjsKJouE914Un2a04"
MANIFEST_PATH = "/mnt/e/genesis-system/scripts/gold_pipeline/output/deployment_manifest.json"
API_BASE = "https://api.netlify.com/api/v1"

# VentraIP domains only (Tiers 4-9)
VENTRAIP_DOMAINS = [
    # Tier 4: City-specific
    "sydneychatbots.com.au", "brisbanechatbots.com.au", "melbournechatbots.com.au",
    "adelaidechatbots.com.au", "cairnschatbots.com.au", "sunshinecoastchatbots.com.au",
    "townsvillechatbots.com.au", "darwinchatbots.com.au", "aichatbotsbrisbane.au",
    "aichatbotsaustralia.au",
    # Tier 5: Trade-specific
    "tradiechatbots.com.au", "tradiechatbot.com.au", "tradiesvoice.com.au",
    "tradieautomation.com.au", "aitradie.au", "sparkybots.com.au", "plumberbots.com.au",
    "hvacbots.com.au", "electricianbotai.au", "solarbotai.au", "mechanicbot.au",
    "locksmithbot.au", "rooferbot.au",
    # Tier 6: Industry-specific
    "receptionistai.au", "beautybot.com.au", "propertybotai.com.au", "propertybotai.au",
    "dentalbotai.au", "clinicaibot.au", "lawyerbot.au", "legalbotai.au", "rentbot.au",
    # Tier 7: Voice/Receptionist
    "voiceassistant.com.au", "voiceassistant.au", "aivoicereceptionist.au",
    "phonebot.au", "talkbot.au", "bookingbot.au",
]


def extract_site_id(netlify_url: str) -> str:
    """Extract site subdomain from Netlify URL for API calls."""
    # https://tradiechatbots-com-au-dd4417.netlify.app -> tradiechatbots-com-au-dd4417
    match = re.search(r"https://([^.]+)\.netlify\.app", netlify_url)
    return match.group(1) if match else ""


def get_site_id(client: httpx.Client, subdomain: str) -> str:
    """Get the Netlify site ID from subdomain."""
    resp = client.get(f"{API_BASE}/sites/{subdomain}.netlify.app")
    if resp.status_code == 200:
        return resp.json()["id"]
    return ""


def add_custom_domain(client: httpx.Client, site_id: str, domain: str) -> dict:
    """Add a custom domain to a Netlify site by setting it as the custom_domain."""
    # Use PATCH to set custom_domain on the site
    resp = client.patch(
        f"{API_BASE}/sites/{site_id}",
        json={"custom_domain": domain},
    )
    try:
        data = resp.json() if resp.content else {}
    except Exception:
        data = {"text": resp.text[:500]}
    return {"status": resp.status_code, "data": data}


def main():
    with open(MANIFEST_PATH) as f:
        manifest = json.load(f)

    client = httpx.Client(
        headers={"Authorization": f"Bearer {NETLIFY_TOKEN}"},
        timeout=30.0,
    )

    results = {"success": [], "already_exists": [], "failed": []}

    for domain in VENTRAIP_DOMAINS:
        netlify_url = manifest.get(domain)
        if not netlify_url:
            print(f"  SKIP {domain} — not in manifest")
            results["failed"].append({"domain": domain, "reason": "not in manifest"})
            continue

        subdomain = extract_site_id(netlify_url)
        if not subdomain:
            print(f"  SKIP {domain} — can't parse Netlify URL")
            results["failed"].append({"domain": domain, "reason": "bad URL"})
            continue

        # Get site ID
        site_id = get_site_id(client, subdomain)
        if not site_id:
            print(f"  FAIL {domain} — can't find Netlify site {subdomain}")
            results["failed"].append({"domain": domain, "reason": "site not found"})
            continue

        # Add custom domain
        result = add_custom_domain(client, site_id, domain)

        if result["status"] == 200 or result["status"] == 201:
            print(f"  OK   {domain} → {subdomain}.netlify.app")
            results["success"].append(domain)
        elif result["status"] == 422:
            # Already exists or conflict
            msg = str(result.get("data", ""))
            if "already" in msg.lower() or "taken" in msg.lower():
                print(f"  EXIST {domain} — already configured")
                results["already_exists"].append(domain)
            else:
                print(f"  WARN {domain} — 422: {msg[:100]}")
                results["failed"].append({"domain": domain, "reason": msg[:200]})
        else:
            print(f"  FAIL {domain} — HTTP {result['status']}: {str(result.get('data', ''))[:100]}")
            results["failed"].append({"domain": domain, "reason": f"HTTP {result['status']}"})

        time.sleep(0.3)  # Rate limit courtesy

    client.close()

    print(f"\n{'='*50}")
    print(f"RESULTS: {len(results['success'])} added, {len(results['already_exists'])} existed, {len(results['failed'])} failed")
    print(f"{'='*50}")

    # Save results
    out_path = "/mnt/e/genesis-system/scripts/gold_pipeline/output/netlify_domain_results.json"
    with open(out_path, "w") as f:
        json.dump(results, f, indent=2)
    print(f"Results saved: {out_path}")

    # Print DNS instructions
    print(f"\n{'='*50}")
    print("DNS RECORDS NEEDED AT VENTRAIP:")
    print(f"{'='*50}")
    for domain in results["success"] + results["already_exists"]:
        subdomain = extract_site_id(manifest[domain])
        if domain.count(".") == 1:
            # .au domain — root only
            print(f"  {domain:<35} A     → 75.2.60.5")
            print(f"  www.{domain:<31} CNAME → {subdomain}.netlify.app")
        else:
            # .com.au domain — root + www
            print(f"  {domain:<35} A     → 75.2.60.5")
            print(f"  www.{domain:<31} CNAME → {subdomain}.netlify.app")


if __name__ == "__main__":
    main()
