#!/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,
            "dimensions": {
                "device_type": "none",
            },
        },
        "mac": {
            "os": MAC_OS,
            "dimensions": {
                "cpu": "x86",
                "device_type": "none",
            },
        },
        "mac_arm64": {
            "os": MAC_ARM64_OS,
            "dimensions": {
                "cpu": "arm",
                "device_type": "none",
            },
        },
        "windows": {
            "os": WINDOWS_OS,
            "dimensions": {
                "device_type": "none",
            },
        },
    }
    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_deploy",
                "validation_name": "Docs Deploy",
                "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)
