# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from google.protobuf import json_format

from recipe_engine.config import List
from recipe_engine.recipe_api import Property

from PB.infra.fuchsia import Fuchsia

DEPS = [
    "fuchsia/checkout",
    "fuchsia/jiri",
    "recipe_engine/buildbucket",
    "recipe_engine/json",
    "recipe_engine/raw_io",
]

PROPERTIES = {
    "project": Property(
        kind=str,
        help="The name of that jiri should assign to the project",
        default="garnet",
    ),
    "remote": Property(
        kind=str,
        help="The remote URL of the manifest repo",
        default="https://fuchsia.googlesource.com/manifest",
    ),
    "manifest": Property(
        kind=str,
        help="The name of the manifest to import from the integration repo",
        default="minimal",
    ),
    "is_release_version": Property(
        kind=bool, help="Whether or not checkout is a release version", default=False
    ),
    "attributes": Property(
        kind=List(str),
        help="Attributes corresponding to optional packages or projects to checkout",
        default=(),
    ),
}


def RunSteps(api, project, remote, manifest, is_release_version, attributes):
    checkout_spec = Fuchsia.Checkout(
        project=project,
        remote=remote,
        manifest=manifest,
        is_release_version=is_release_version,
        attributes=attributes,
    )
    checkout = api.checkout.from_spec(checkout_spec)
    assert checkout.root_dir
    assert checkout.snapshot_file
    checkout.release_version  # pylint: disable=pointless-statement
    checkout.changed_files(api.buildbucket.build.input)
    checkout.upload_results("gcs_bucket")
    checkout.upload_source_manifest("gcs_artifact_bucket")


def GenTests(api):
    yield api.checkout.test(
        "default", source_info={},  # Just to cover part of test API
    )
    yield api.checkout.test(
        "global_integration_tryjob", properties=dict(project="integration",),
    )

    yield api.checkout.test(
        "global_integration_ci",
        properties=dict(project="integration", bucket="global",),
    ) + api.buildbucket.ci_build(
        git_repo="https://fuchsia.googlesource.com/integration"
    )

    yield api.checkout.test(
        "global_integration_release_ci",
        tryjob=False,
        properties=dict(
            project="integration",
            bucket="global",
            is_release_version=True,
            attributes=["attr1", "attr2"],
        ),
    ) + api.buildbucket.ci_build(
        git_repo="https://fuchsia.googlesource.com/integration"
    ) + api.step_data(
        "checkout.git describe", api.raw_io.stream_output("releases/0.20190603.0.1")
    )

    yield api.checkout.test(
        "global_integration_release_ci_invalid_tag",
        status="failure",
        tryjob=False,
        properties=dict(
            project="integration", bucket="global", is_release_version=True,
        ),
    ) + api.buildbucket.ci_build(
        git_repo="https://fuchsia.googlesource.com/integration"
    ) + api.step_data(
        "checkout.git describe", api.raw_io.stream_output("invalidtag")
    )

    yield api.checkout.test(
        "local_integration_tryjob", properties=dict(project="garnet",),
    )

    yield api.checkout.test(
        "local_integration_tryjob_patch_failure",
        status="infra_failure",
        properties=dict(project="garnet",),
    ) + api.step_data("checkout.jiri patch", retcode=1)

    yield api.checkout.test(
        "local_integration_tryjob_patch_rebase_failure",
        status="failure",
        properties=dict(project="garnet",),
    ) + api.step_data("checkout.jiri patch", retcode=api.jiri.RebaseError.EXIT_CODE)

    yield api.checkout.test(
        "local_integration_ci", tryjob=False,
    ) + api.buildbucket.ci_build(git_repo="https://fuchsia.googlesource.com/not-garnet")

    yield api.checkout.test(
        "tryjob_with_patchfile",
        properties=dict(project="garnet",),
        patchfile=[
            {
                "ref": "refs/changes/cc/aabbcc/1",
                "host": "example-review.googlesource.com",
                "project": "not_garnet",
            }
        ],
    )

    yield api.checkout.test(
        "fail_to_patch_over_gerrit_change",
        status="failure",
        properties=dict(project="garnet",),
        patchfile=[
            {
                "ref": "refs/changes/cc/aabbcc/1",
                "host": "fuchsia-review.googlesource.com",
                "project": "garnet",
            }
        ],
    )

    yield api.checkout.test(
        "fail_to_patch_same_project_many_times",
        status="failure",
        properties=dict(project="garnet",),
        patchfile=[
            {
                "ref": "refs/changes/cc/aabbcc/1",
                "host": "fuchsia-review.googlesource.com",
                "project": "zircon",
            },
            {
                "ref": "refs/changes/ff/ddeeff/2",
                "host": "fuchsia-review.googlesource.com",
                "project": "zircon",
            },
        ],
    )

    yield api.checkout.test(
        "when_patchfile_host_has_protocol",
        properties=dict(project="garnet",),
        patchfile=[
            {
                "ref": "refs/changes/cc/aabbcc/1",
                "host": "https://fuchsia-review.googlesource.com",
                "project": "zircon",
            }
        ],
    )

    yield api.checkout.test(
        "should_ignore_patches_for_non_dependant_projects",
        properties=dict(project="zircon",),
        patchfile=[
            {
                "ref": "refs/changes/cc/aabbcc/1",
                "host": "https://fuchsia-review.googlesource.com",
                "project": "topaz",
                # TODO(tonglisayhi): Figure out a way to inject this step_data with
                # whatever nesting this step is
            }
        ],
    ) + api.step_data("checkout.jiri project", api.json.output([]))

    yield api.checkout.test(
        "sso_manifest_remote", properties=dict(remote="sso://manifest-host/manifest")
    ) + api.buildbucket.ci_build(git_repo="https://fuchsia.googlesource.com/not-garnet")

    yield api.checkout.test(
        "subbuild_from_spec",
        properties={
            "spec_msg": json_format.MessageToJson(
                Fuchsia(
                    checkout=Fuchsia.Checkout(
                        project="integration",
                        manifest="minimal",
                        remote="https://fuchsia.googlesource.com/manifest",
                    )
                )
            ),
        },
    )

    yield api.checkout.test(
        "use_gitiles_commit_from_properties",
        tryjob=False,
        properties={
            "checkout.buildset": "commit/gitiles/fuchsia.googlesource.com/foo/+/deadbeef",
        },
    )
