import pytest
from flask import json

from tests.app.db import create_organisation, create_service


@pytest.mark.parametrize("path", ["/", "/_status"])
def test_get_status_all_ok(client, notify_db_session, path):
    response = client.get(path)
    assert response.status_code == 200
    resp_json = json.loads(response.get_data(as_text=True))
    assert resp_json["status"] == "ok"
    assert resp_json["db_version"]
    assert resp_json["git_commit"]
    assert resp_json["build_time"]


def test_empty_live_service_and_organisation_counts(admin_request):
    assert admin_request.get("status.live_service_and_organisation_counts") == {
        "organisations": 0,
        "services": 0,
    }


def test_populated_live_service_and_organisation_counts(admin_request):

    # Org 1 has three real live services and one fake, for a total of 3
    org_1 = create_organisation("org 1")
    live_service_1 = create_service(service_name="1")
    live_service_1.organisation = org_1
    live_service_2 = create_service(service_name="2")
    live_service_2.organisation = org_1
    live_service_3 = create_service(service_name="3")
    live_service_3.organisation = org_1
    fake_live_service_1 = create_service(service_name="f1", count_as_live=False)
    fake_live_service_1.organisation = org_1
    inactive_service_1 = create_service(service_name="i1", active=False)
    inactive_service_1.organisation = org_1

    # This service isn’t associated to an org, but should still be counted as live
    create_service(service_name="4")

    # Org 2 has no real live services
    org_2 = create_organisation("org 2")
    trial_service_1 = create_service(service_name="t1", restricted=True)
    trial_service_1.organisation = org_2
    fake_live_service_2 = create_service(service_name="f2", count_as_live=False)
    fake_live_service_2.organisation = org_2
    inactive_service_2 = create_service(service_name="i2", active=False)
    inactive_service_2.organisation = org_2

    # Org 2 has no services at all
    create_organisation("org 3")

    # This service isn’t associated to an org, and should not be counted as live
    # because it’s marked as not counted
    create_service(service_name="f3", count_as_live=False)

    # This service isn’t associated to an org, and should not be counted as live
    # because it’s in trial mode
    create_service(service_name="t", restricted=True)
    create_service(service_name="i", restricted=False, active=False)

    assert admin_request.get("status.live_service_and_organisation_counts") == {
        "organisations": 1,
        "services": 4,
    }
