import requests
import time

from .conftest import API_PREFIX
from .utils import get_crawl_status

crawl_id_a = None
crawl_id_b = None


def test_set_concurrent_crawl_limit(org_with_quotas, admin_auth_headers):
    r = requests.post(
        f"{API_PREFIX}/orgs/{org_with_quotas}/quotas",
        headers=admin_auth_headers,
        json={"maxConcurrentCrawls": 1},
    )
    data = r.json()
    assert data.get("updated") == True


def test_run_two_only_one_concurrent(org_with_quotas, admin_auth_headers):
    global crawl_id_a
    crawl_id_a = run_crawl(org_with_quotas, admin_auth_headers)
    time.sleep(1)

    global crawl_id_b
    crawl_id_b = run_crawl(org_with_quotas, admin_auth_headers)

    while get_crawl_status(org_with_quotas, crawl_id_a, admin_auth_headers) in (
        "starting",
        "waiting_capacity",
    ):
        time.sleep(2)

    assert get_crawl_status(org_with_quotas, crawl_id_a, admin_auth_headers) in (
        "running",
        "generate-wacz",
        "uploading-wacz",
        "pending-wait",
    )

    while (
        get_crawl_status(org_with_quotas, crawl_id_b, admin_auth_headers) == "starting"
    ):
        time.sleep(2)

    assert (
        get_crawl_status(org_with_quotas, crawl_id_b, admin_auth_headers)
        == "waiting_org_limit"
    )


def test_cancel_and_run_other(org_with_quotas, admin_auth_headers):
    r = requests.post(
        f"{API_PREFIX}/orgs/{org_with_quotas}/crawls/{crawl_id_a}/cancel",
        headers=admin_auth_headers,
    )
    data = r.json()
    assert data["success"] == True

    while (
        get_crawl_status(org_with_quotas, crawl_id_a, admin_auth_headers) != "canceled"
    ):
        time.sleep(2)

    while (
        get_crawl_status(org_with_quotas, crawl_id_b, admin_auth_headers)
        == "waiting_org_limit"
    ):
        time.sleep(5)

    assert get_crawl_status(org_with_quotas, crawl_id_b, admin_auth_headers) in (
        "starting",
        "running",
        "waiting_capacity",
        "generate-wacz",
        "uploading-wacz",
        "pending-wait",
    )

    # cancel second crawl as well
    r = requests.post(
        f"{API_PREFIX}/orgs/{org_with_quotas}/crawls/{crawl_id_b}/cancel",
        headers=admin_auth_headers,
    )
    data = r.json()
    assert data["success"] == True


def run_crawl(org_id, headers):
    crawl_data = {
        "runNow": True,
        "name": "Concurrent Crawl",
        "config": {
            "seeds": [{"url": "https://specs.webrecorder.net/"}],
            "limit": 1,
        },
    }
    r = requests.post(
        f"{API_PREFIX}/orgs/{org_id}/crawlconfigs/",
        headers=headers,
        json=crawl_data,
    )
    data = r.json()

    return data["run_now_job"]
