#!/usr/bin/env python3
import argparse
import contextlib
import os
import subprocess
import sys
from collections.abc import Iterator

ZULIP_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.chdir(ZULIP_PATH)
sys.path.insert(0, ZULIP_PATH)

# check for the venv
from tools.lib import sanity_check

sanity_check.check_venv(__file__)

from tools.lib.test_script import add_provision_check_override_param
from tools.lib.test_server import test_server_running

parser = argparse.ArgumentParser()
add_provision_check_override_param(parser)
parser.add_argument(
    "--skip-external-links",
    dest="skip_external_link_check",
    action="store_true",
    help="Skip checking of external links.",
)
options = parser.parse_args()

os.makedirs("var/help-documentation", exist_ok=True)

LOG_FILE = "var/help-documentation/server.log"
external_host = "localhost:9981"

extra_args = ["-a", "validate_html=set"]

if options.skip_external_link_check:
    extra_args += ["-a", "skip_external=set"]


@contextlib.contextmanager
def vnu_servlet() -> Iterator[None]:
    with subprocess.Popen(
        [
            "java",
            "-cp",
            os.path.join(
                os.path.dirname(__file__),
                "../node_modules/vnu-jar/build/dist/vnu.jar",
            ),
            "-Dnu.validator.servlet.bind-address=127.0.0.1",
            "nu.validator.servlet.Main",
            "9988",
        ]
    ) as proc:
        yield
        proc.terminate()


with (
    vnu_servlet(),
    test_server_running(options.skip_provision_check, external_host, log_file=LOG_FILE, dots=True),
):
    ret_help_doc = subprocess.call(
        ["scrapy", "crawl_with_status", *extra_args, "help_documentation_crawler"],
        cwd="tools/documentation_crawler",
    )
    ret_api_doc = subprocess.call(
        ["scrapy", "crawl_with_status", *extra_args, "api_documentation_crawler"],
        cwd="tools/documentation_crawler",
    )
    ret_portico_doc = subprocess.call(
        ["scrapy", "crawl_with_status", *extra_args, "portico_documentation_crawler"],
        cwd="tools/documentation_crawler",
    )

if ret_help_doc != 0 or ret_api_doc != 0 or ret_portico_doc != 0:
    print("\033[0;91m")
    print("Failed")
    print("\033[0m")
else:
    print("\033[0;92m")
    print("Passed!")
    print("\033[0m")


sys.exit(ret_help_doc or ret_api_doc or ret_portico_doc)
