#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2019 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A custom script example that utilizes the .JSON contents of the tryjob."""


import json
import sys

from update_tryjob_status import TryjobStatus


def main():
    """Determines the exit code based off of the contents of the .JSON file."""

    # Index 1 in 'sys.argv' is the path to the .JSON file which contains
    # the contents of the tryjob.
    #
    # Format of the tryjob contents:
    #   {
    #     "status" : [TRYJOB_STATUS],
    #     "buildbucket_id" : [BUILDBUCKET_ID],
    #     "extra_cls" : [A_LIST_OF_EXTRA_CLS_PASSED_TO_TRYJOB],
    #     "url" : [GERRIT_URL],
    #     "builder" : [TRYJOB_BUILDER_LIST],
    #     "rev" : [REVISION],
    #     "link" : [LINK_TO_TRYJOB],
    #     "options" : [A_LIST_OF_OPTIONS_PASSED_TO_TRYJOB]
    #   }
    abs_path_json_file = sys.argv[1]

    with open(abs_path_json_file) as f:
        tryjob_contents = json.load(f)

    CUTOFF_PENDING_REVISION = 369416

    SKIP_REVISION_CUTOFF_START = 369420
    SKIP_REVISION_CUTOFF_END = 369428

    if tryjob_contents["status"] == TryjobStatus.PENDING.value:
        if tryjob_contents["rev"] <= CUTOFF_PENDING_REVISION:
            # Exit code 0 means to set the tryjob 'status' as 'good'.
            sys.exit(0)

        # Exit code 124 means to set the tryjob 'status' as 'bad'.
        sys.exit(124)

    if tryjob_contents["status"] == TryjobStatus.BAD.value:
        # Need to take a closer look at the contents of the tryjob to then decide
        # what that tryjob's 'status' value should be.
        #
        # Since the exit code is not in the mapping, an exception will occur which
        # will save the file in the directory of this custom script example.
        sys.exit(1)

    if tryjob_contents["status"] == TryjobStatus.SKIP.value:
        # Validate that the 'skip value is really set between the cutoffs.
        if (
            SKIP_REVISION_CUTOFF_START
            < tryjob_contents["rev"]
            < SKIP_REVISION_CUTOFF_END
        ):
            # Exit code 125 means to set the tryjob 'status' as 'skip'.
            sys.exit(125)

        if tryjob_contents["rev"] >= SKIP_REVISION_CUTOFF_END:
            sys.exit(124)


if __name__ == "__main__":
    main()
