# Copyright 2019 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from recipe_engine import recipe_api


class KubectlApi(recipe_api.RecipeApi):
    """Provides steps to connect and run Kubectl images."""

    def __init__(self, luci_context, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._luci_context = luci_context

    def __call__(self, *args, **kwargs):
        """Executes specified kubectl command.

        Args:
        args: arguments passed to the 'kubectl' command including subcommand name,
            e.g. api.kubectl('config', 'view', step_name='view kubectl configuration').
        kwargs: arguments passed down to api.step module.
        """
        cmd = [self._kubectl_executable]
        step_name = kwargs.pop("step_name", "kubectl %s" % args[0])
        return self.m.step(step_name, cmd + list(args), **kwargs)

    @property
    def _kubectl_executable(self):
        self.m.gcloud.patch_gcloud_invoker()
        return self.m.ensure_tool("kubectl", self.resource("tool_manifest.json"))

    @property
    def version(self):
        """Returns kubectl client version installed or None if failed to detect."""
        step = self(
            "version",
            stdout=self.m.raw_io.output_text(),
            step_name="retrieve kubectl version",
            step_test_data=lambda: self.m.raw_io.test_api.stream_output_text(
                'Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.1", GitCommit:"d647ddbd755faf07169599a625faf302ffc34458", GitTreeState:"clean", BuildDate:"2019-10-02T17:01:15Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}'
            ),
        )
        if 'GitCommit:"' in step.stdout:
            index = step.stdout.find('GitCommit:"')
            index_end = step.stdout.find('"', index + len('GitCommit:"'))
            version = step.stdout[index + len('GitCommit:"') : index_end]
        else:
            version = "unknown"
        step.presentation.step_text = version
        return version
