# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Utility functions for uploading a cipd package."""

from recipe_engine import recipe_api


class CipdUploadApi(recipe_api.RecipeApi):
    """Utility functions for uploading a cipd package."""

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._platform = None

    @property
    def platform(self):
        if self._platform:
            return self._platform
        operating_system = self.m.platform.name.replace('win', 'windows')
        architecture = {
            'intel': {32: '386', 64: 'amd64',},
            'arm': {32: 'armv6', 64: 'arm64',},
        }[self.m.platform.arch][self.m.platform.bits]
        self._platform = '-'.join((operating_system, architecture))
        return self._platform

    def __call__(
        self,
        cipd_path,
        package_root,
        search_tag,
        paths=(),
        repository=None,
        install_mode='copy',
        metadata=None,
        add_platform=True,
    ):
        """Create CIPD package and upload it.

    Args:
      cipd_path(str): CIPD package path
      package_root(Path): path from which relative paths should be calculated,
        if neither package_dirs nor package_files is listed all files within
        this directory are included in the package
      search_tag(dict[str,str]): primary key for revision of package
      paths(Sequence[Path]): list of files and directories to include in package
      repository(str): URL of repository, used as a CIPD tag
      install_mode(str|None): 'copy', 'symlink', or None
      metadata(list of pair|None): metadata to add to package
      add_platform(bool): add platform string to the end of cipd_path

    Returns:
      Instance id of uploaded package.
    """

        name = str(cipd_path.split('/')[-1])

        if add_platform:
            assert not cipd_path.endswith(self.platform)
            cipd_path = '/'.join((cipd_path.rstrip('/'), self.platform))

        if not paths:
            paths = [package_root]

        return self.m.cipd_util.upload_package(
            pkg_name=cipd_path,
            pkg_root=package_root,
            pkg_paths=paths,
            search_tag=search_tag,
            repository=repository,
            install_mode=install_mode,
            metadata=metadata,
            name=name,
        )
