#!/usr/bin/env python3
#
# Copyright 2019 Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file.
#
# 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
#
#      http://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.

import util
import os
import version
import yaml
import ctx
from product.util import (
    ComponentDescriptor,
    ComponentDescriptorResolver,
)
from github.util import (
    GitHubRepositoryHelper,
    find_greatest_github_release_version,
)

gardener_component="github.com/gardener/gardener"
gardensetup_component="github.com/gardener/garden-setup"


cd_path = os.getenv("OUT_PATH")
if not cd_path:
    cd_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../component_descriptor_dir")

descriptor_path = os.path.join(cd_path, "previous_component_descriptor.yaml")

github_cfg_name = "github_com"
github_cfg = ctx.cfg_factory().github(github_cfg_name)
component_resolver = ComponentDescriptorResolver(ctx.cfg_factory())

def get_releases(github_repository_owner: str, github_repository_name: str):
    github_helper = GitHubRepositoryHelper(
        owner=github_repository_owner,
        name=github_repository_name,
        github_cfg=github_cfg,
    )

    releases = github_helper.repository.releases()
    release_versions = [
        release.name for release in releases if release.name and "draft" not in release.name
    ]
    return release_versions

def supports_component(component_descriptor: ComponentDescriptor, name: str, version: str):
    for component in component_descriptor.raw["components"]:
        if component["name"] == name:
            return component["version"] == version
    return False

latest_gardener_release = version.find_latest_version(get_releases("gardener", "gardener"))
if not latest_gardener_release:
    print("No latest gardener version found")
    exit(1)

print("Found latest gardener version {}".format(latest_gardener_release))

gardensetup_releases = get_releases("gardener", "garden-setup")
supported_releases = []
for release in gardensetup_releases:
    try:
        component_descriptor = component_resolver.retrieve_descriptor((gardensetup_component, release))
        if supports_component(component_descriptor, gardener_component, latest_gardener_release):
            supported_releases.append(release)
    except:
        pass

if not supported_releases:
    print("No supported garden-setup versions found")
    exit(1)

latest_supported_gardensetup = version.find_latest_version(supported_releases)

print("Use garden-setup version {}".format(latest_supported_gardensetup))

component_descriptor = component_resolver.retrieve_descriptor((gardensetup_component, latest_supported_gardensetup))
raw_component_descriptor = yaml.dump(component_descriptor.raw)
with open(descriptor_path, "w+") as file:
    file.write(raw_component_descriptor)

print("component_descriptor written to {}".format(descriptor_path))
print(raw_component_descriptor)
