#!/usr/bin/env lucicfg
# Copyright 2020 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Configurations for packaging builders.

The schedulers pull commits indirectly from GoB repo (https://chromium.googlesource.com/external/github.com/flutter/flutter)
which is mirrored from https://github.com/flutter/flutter.
"""

load("//lib/common.star", "common")
load("//lib/repos.star", "repos")
load("//lib/timeout.star", "timeout")

# Global OS variables
LINUX_OS = "Ubuntu"
WINDOWS_OS = "Windows"
MAC_OS = "Mac-12"
MAC_ARM64_OS = "Mac-12"

# Linux caches
LINUX_DEFAULT_CACHES = [
    # Android SDK
    swarming.cache(name = "android_sdk", path = "android"),
    # Chrome
    swarming.cache(name = "chrome_and_driver", path = "chrome"),
    # OpenJDK
    swarming.cache(name = "openjdk", path = "java"),
    # PubCache
    swarming.cache(name = "pub_cache", path = ".pub-cache"),
    # Flutter SDK code
    swarming.cache(name = "flutter_sdk", path = "flutter sdk"),
]

def _setup(branches):
    platform_args = {
        "linux": {
            "os": LINUX_OS,
        },
        "mac": {
            "os": MAC_OS,
            "dimensions": {"cpu": "x86"},
        },
        "mac_arm64": {
            "os": MAC_ARM64_OS,
            "dimensions": {"cpu": "arm"},
        },
        "windows": {
            "os": WINDOWS_OS,
        },
    }
    luci.recipe(
        name = "packaging/packaging",
        recipe = "packaging/packaging",
        cipd_package = "flutter/recipe_bundles/flutter.googlesource.com/recipes",
        cipd_version = branches.main.recipes_ref,
        use_bbagent = True,
    )
    packaging_prod_config(
        platform_args,
        "stable",
        branches.stable.release_ref,
    )

    packaging_prod_config(
        platform_args,
        "beta",
        branches.beta.release_ref,
    )

    packaging_prod_config(
        platform_args,
        "master",
        # Note for master, there is no distinction between testing_ref &
        # release_ref
        "refs/heads/master",
    )

def builder_name(pattern, branch):
    return pattern % (branch.capitalize(), branch)

def packaging_prod_config(platform_args, branch, ref):
    """Prod configurations for packaging flutter framework artifacts.

    Args:
      platform_args(dict): Dictionary with default properties with platform as
        key.
      branch(str): The branch name we are creating configurations for.
      ref(str): The git ref we are creating configurations for.
    """
    # TODO(chillers): Migrate packaging builders to ci.yaml. https://github.com/flutter/flutter/issues/100806

    # Defines console views for prod builders
    console_view_name = ("packaging" if branch == "master" else "%s_packaging" % branch)
    luci.console_view(
        name = console_view_name,
        repo = repos.GIT_REMOTE["flutter"],
        refs = [ref],
    )

    # Defines prod schedulers
    trigger_name = branch + "-gitiles-trigger-packaging"
    luci.gitiles_poller(
        name = trigger_name,
        bucket = "prod",
        repo = repos.GIT_REMOTE["flutter"],
        refs = [ref],
    )

    # Defines triggering policy
    if branch == "master":
        triggering_policy = scheduler.greedy_batching(
            max_concurrent_invocations = 6,
        )
    else:
        triggering_policy = scheduler.greedy_batching(
            max_concurrent_invocations = 3,
        )

    # Select which firebase project to upload the docs to.
    firebase_project = ""
    if branch == "stable":
        firebase_project = "docs-flutter-dev"

    # Packaging docs builds are only done on master and stable channels
    # However, ci.yaml generates the master build
    if branch in ("stable"):
        common.linux_prod_builder(
            name = "Linux%s docs_publish|docs" % ("" if branch == "master" else " " + branch),
            recipe = "%s-flutter/flutter" % "main",
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            properties = {
                "validation": "docs",
                "validation_name": "Docs",
                "dependencies": [{"dependency": "dashing"}, {"dependency": "firebase"}, {"dependency": "curl"}],
                "firebase_project": firebase_project,
                # This determines which release channel docs to deploy
                "release_ref": ref,
            },
            caches = LINUX_DEFAULT_CACHES,
            os = LINUX_OS,
            execution_timeout = timeout.LONG,
            expiration_timeout = timeout.LONG_EXPIRATION,
        )

    # Packaging should only build from release branches and never from master. This
    # is to prevent using excesive amount of resources to package something we will
    # never use.
    if branch in ("beta", "stable"):
        # Defines framework prod builders
        if branch == "stable":  # TODO(drewroen): Remove the branch check for linux flutter packaging when cosign is determined to work correctly
            common.linux_prod_builder(
                name = builder_name("Linux Flutter %s Packaging|%s", branch),
                recipe = "packaging/packaging",
                console_view_name = console_view_name,
                triggered_by = [trigger_name],
                triggering_policy = triggering_policy,
                priority = 25,
                **platform_args["linux"]
            )
        else:
            common.linux_prod_builder(
                name = builder_name("Linux Flutter %s Packaging|%s", branch),
                recipe = "packaging/packaging",
                console_view_name = console_view_name,
                triggered_by = [trigger_name],
                triggering_policy = triggering_policy,
                properties = {
                    "dependencies": [{"dependency": "cosign"}],
                    "upload_with_cosign": True,
                },
                priority = 25,
                **platform_args["linux"]
            )
        common.mac_prod_builder(
            name = builder_name("Mac Flutter %s Packaging|%s", branch),
            recipe = "packaging/packaging",
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["mac"]
        )
        common.mac_prod_builder(
            name = builder_name("Mac Arm64 Flutter %s Packaging|%s", branch),
            recipe = "packaging/packaging",
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["mac_arm64"]
        )
        common.windows_prod_builder(
            name = builder_name("Windows Flutter %s Packaging|%s", branch),
            recipe = "packaging/packaging",
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["windows"]
        )

packaging_config = struct(setup = _setup)
