# Copyright 2016 The Fuchsia 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

import textwrap


class GoApi(recipe_api.RecipeApi):
    """GoApi provides support for Go."""

    def __init__(self, *args, **kwargs):
        super(GoApi, self).__init__(*args, **kwargs)
        self._go_dir = None
        self._go_version = None

    def __call__(self, *args, **kwargs):
        """Return a Go command step."""
        assert self._go_dir

        name = kwargs.pop('name', 'go ' + args[0])
        env = kwargs.setdefault('env', {})
        go_cmd = [self.go_executable]
        env.setdefault('GOROOT', self._go_dir)

        return self.m.step(name, go_cmd + list(args or []), **kwargs)

    def ensure_go(self, version=None):
        """Ensures that go distribution is installed."""
        with self.m.step.nest('ensure_go'):
            with self.m.step.context({'infra_step': True}):
                go_package = ('fuchsia/go/go/%s' %
                    self.m.cipd.platform_suffix())
                self._go_dir = self.m.path['start_dir'].join('cipd', 'go')

                self.m.cipd.ensure(self._go_dir,
                                   {go_package: version or 'release'})

                return self._go_dir

    @property
    def go_executable(self):
        return self.m.path.join(self._go_dir, 'bin', 'go')

    def inline(self, program, add_go_log=True, **kwargs):
        """Run an inline Go program as a step.
        Program is output to a temp file and run when this step executes.
        """
        program = textwrap.dedent(program)

        try:
            self('run', self.m.raw_io.input(program, '.go'), **kwargs)
        finally:
            result = self.m.step.active_result
            if result and add_go_log:
                result.presentation.logs['go.inline'] = program.splitlines()

        return result
