#!/usr/bin/env python3
# encoding: utf-8
"""
releaseutils.py

This contains no main method only utility functions to
run sanity checks on the Checker Framework.
Created by Jonathan Burke 11/21/2012

Copyright (c) 2012 University of Washington
"""

import zipfile

from release_vars import CHECKER_FRAMEWORK
from release_vars import CHECKER_FRAMEWORK_RELEASE
from release_vars import SANITY_DIR

from release_vars import execute

from release_utils import are_in_file
from release_utils import delete
from release_utils import delete_path
from release_utils import download_binary
from release_utils import ensure_user_access
from release_utils import execute_write_to_file
from release_utils import insert_before_line
from release_utils import os
from release_utils import wget_file


def javac_sanity_check(checker_framework_website, release_version):
    """
    Download the release of the Checker Framework from the development website
    and NullnessExampleWithWarnings.java from the GitHub repository.
    Run the Nullness Checker on NullnessExampleWithWarnings and verify the output
    Fails if the expected errors are not found in the output.
    """

    new_checkers_release_zip = os.path.join(
        checker_framework_website,
        "releases",
        release_version,
        "checker-framework-" + release_version + ".zip",
    )

    javac_sanity_dir = os.path.join(SANITY_DIR, "javac")

    if os.path.isdir(javac_sanity_dir):
        delete_path(javac_sanity_dir)
    execute("mkdir -p " + javac_sanity_dir)

    javac_sanity_zip = os.path.join(
        javac_sanity_dir, "checker-framework-%s.zip" % release_version
    )

    print(
        "Attempting to download %s to %s" % (new_checkers_release_zip, javac_sanity_zip)
    )
    download_binary(new_checkers_release_zip, javac_sanity_zip)

    nullness_example_url = "https://raw.githubusercontent.com/typetools/checker-framework/master/docs/examples/NullnessExampleWithWarnings.java"
    nullness_example = os.path.join(
        javac_sanity_dir, "NullnessExampleWithWarnings.java"
    )

    if os.path.isfile(nullness_example):
        delete(nullness_example)

    wget_file(nullness_example_url, javac_sanity_dir)

    deploy_dir = os.path.join(javac_sanity_dir, "checker-framework-" + release_version)

    if os.path.exists(deploy_dir):
        print("Deleting existing path: " + deploy_dir)
        delete_path(deploy_dir)

    with zipfile.ZipFile(javac_sanity_zip, "r") as z:
        z.extractall(javac_sanity_dir)

    ensure_user_access(deploy_dir)

    sanity_javac = os.path.join(deploy_dir, "checker", "bin", "javac")
    nullness_output = os.path.join(deploy_dir, "output.log")

    cmd = (
        sanity_javac
        + " -processor org.checkerframework.checker.nullness.NullnessChecker "
        + nullness_example
        + " -Anomsgtext"
    )
    execute_write_to_file(cmd, nullness_output, False)
    check_results(
        "Javac sanity check",
        nullness_output,
        [
            "NullnessExampleWithWarnings.java:23: error: (assignment)",
            "NullnessExampleWithWarnings.java:33: error: (argument)",
        ],
    )

    # this is a smoke test for the built-in checker shorthand feature
    # https://checkerframework.org/manual/#shorthand-for-checkers
    nullness_shorthand_output = os.path.join(deploy_dir, "output_shorthand.log")
    cmd = (
        sanity_javac
        + " -processor NullnessChecker "
        + nullness_example
        + " -Anomsgtext"
    )
    execute_write_to_file(cmd, nullness_shorthand_output, False)
    check_results(
        "Javac Shorthand Sanity Check",
        nullness_shorthand_output,
        [
            "NullnessExampleWithWarnings.java:23: error: (assignment)",
            "NullnessExampleWithWarnings.java:33: error: (argument)",
        ],
    )


def maven_sanity_check(sub_sanity_dir_name, repo_url, release_version):
    """
    Run the Maven sanity check with the local artifacts or from the repo at
    repo_url.
    """
    checker_dir = os.path.join(CHECKER_FRAMEWORK, "checker")
    maven_sanity_dir = os.path.join(SANITY_DIR, sub_sanity_dir_name)
    if os.path.isdir(maven_sanity_dir):
        delete_path(maven_sanity_dir)

    execute("mkdir -p " + maven_sanity_dir)

    maven_example_dir = os.path.join(maven_sanity_dir, "MavenExample")
    output_log = os.path.join(maven_example_dir, "output.log")

    ant_release_script = os.path.join(CHECKER_FRAMEWORK_RELEASE, "release.xml")
    get_example_dir_cmd = (
        "ant -f %s update-and-copy-maven-example -Dchecker=%s -Dversion=%s -Ddest.dir=%s"
        % (ant_release_script, checker_dir, release_version, maven_sanity_dir)
    )

    execute(get_example_dir_cmd)
    path_to_artifacts = os.path.join(
        os.path.expanduser("~"), ".m2", "repository", "org", "checkerframework"
    )
    if repo_url != "":
        print(
            (
                "This script will now delete your Maven Checker Framework artifacts.\n"
                + "See README-release-process.html#Maven-Plugin dependencies.  These artifacts "
                + "will need to be re-downloaded the next time you need them.  This will be "
                + "done automatically by Maven next time you use the plugin."
            )
        )

        if os.path.isdir(path_to_artifacts):
            delete_path(path_to_artifacts)
        maven_example_pom = os.path.join(maven_example_dir, "pom.xml")
        add_repo_information(maven_example_pom, repo_url)

    os.environ["JAVA_HOME"] = os.environ["JAVA_8_HOME"]
    execute_write_to_file("mvn compile", output_log, False, maven_example_dir)
    if repo_url != "":
        delete_path(path_to_artifacts)


def check_results(title, output_log, expected_errors):
    """Verify the given actual output of a sanity check against the given
    expected output. If the sanity check passed, print the given title of the
    sanity check and a success message. If the sanity check failed, raise an
    exception whose text contains the given title of the sanity check and the
    actual and expected output."""
    found_errors = are_in_file(output_log, expected_errors)

    if not found_errors:
        raise Exception(
            title
            + " did not work!\n"
            + "File: "
            + output_log
            + "\n"
            + "should contain the following errors: [ "
            + ", ".join(expected_errors)
        )
    else:
        print("%s check: passed!\n" % title)


def add_repo_information(pom, repo_url):
    """Adds development maven repo to pom file so that the artifacts used are
    the development artifacts"""
    to_insert = """
        <repositories>
              <repository>
                  <id>checker-framework-repo</id>
                  <url>%s</url>
              </repository>
        </repositories>

        <pluginRepositories>
              <pluginRepository>
                    <id>checker-framework-repo</id>
                    <url>%s</url>
              </pluginRepository>
        </pluginRepositories>
        """ % (
        repo_url,
        repo_url,
    )

    result_str = execute('grep -nm 1 "<build>" %s' % pom, True, True).decode()
    line_no_str = result_str.split(":")[0]
    line_no = int(line_no_str)
    print(" LINE_NO: " + line_no_str)
    insert_before_line(to_insert, pom, line_no)
