#!/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 = "Linux"
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,
        },
    }

    packaging_recipe("packaging/packaging", branches.stable.recipes_ref)
    packaging_prod_config(
        platform_args,
        "stable",
        branches.stable.release_ref,
        branches.stable.recipes_ref,
    )

    packaging_recipe("packaging/packaging", branches.beta.recipes_ref)
    packaging_prod_config(
        platform_args,
        "beta",
        branches.beta.release_ref,
        branches.beta.recipes_ref,
    )

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

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

def packaging_recipe(name, recipes_ref):
    luci.recipe(
        name = common.full_recipe_name(name, recipes_ref),
        recipe = name,
        cipd_package = "flutter/recipe_bundles/flutter.googlesource.com/recipes",
        cipd_version = recipes_ref,
        use_bbagent = True,
    )

def packaging_prod_config(platform_args, branch, ref, recipes_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.
      recipes_ref(str): The git ref used to select the recipes package.
    """
    # 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 = common.full_recipe_name("packaging/packaging", recipes_ref),
                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 = common.full_recipe_name("packaging/packaging", recipes_ref),
                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 = common.full_recipe_name("packaging/packaging", recipes_ref),
            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 = common.full_recipe_name("packaging/packaging", recipes_ref),
            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 = common.full_recipe_name("packaging/packaging", recipes_ref),
            console_view_name = console_view_name,
            triggered_by = [trigger_name],
            triggering_policy = triggering_policy,
            priority = 25,
            **platform_args["windows"]
        )

packaging_config = struct(setup = _setup)
