# Copyright (c) 2019 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: Apache-2.0

import argparse
import os

from west import log
from west.commands import WestCommand

# Relative to the folder where this script lives
COMPLETION_REL_PATH = 'completion/west-completion'

COMP_DESCRIPTION = '''\
Output shell completion scripts for west.

This command outputs completion scripts for different shells by printing them
to stdout. Using the completion scripts:

  bash:
    # one-time
    source <(west completion bash)
    # permanent
    west completion bash > ~/west-completion.bash
    # edit your .bashrc or .bash_profile and add:
    source $HOME/west-completion.bash

  zsh:
    # one-time
    source <(west completion zsh)
    # permanent (might require sudo)
    west completion zsh > "${fpath[1]}/_west"

positional arguments:
  source_dir            application source directory
  cmake_opt             extra options to pass to cmake; implies -c
                        (these must come after "--" as shown above)
'''


class Completion(WestCommand):

    def __init__(self):
        super().__init__(
            'completion',
            # Keep this in sync with the string in west-commands.yml.
            'output shell completion scripts',
            COMP_DESCRIPTION,
            accepts_unknown_args=False)

    def do_add_parser(self, parser_adder):
        parser = parser_adder.add_parser(
            self.name,
            help=self.help,
            formatter_class=argparse.RawDescriptionHelpFormatter,
            description=self.description)

        # Remember to update west-completion.bash if you add or remove
        # flags
        parser.add_argument('shell', nargs=1, choices=['bash', 'zsh'],
                            help='''Shell that which the completion
                            script is intended for.''')
        return parser

    def do_run(self, args, unknown_args):
        cf = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                          *COMPLETION_REL_PATH.split('/'))

        cf += '.' + args.shell[0]

        try:
            with open(cf, 'r') as f:
                print(f.read())
        except FileNotFoundError as e:
            log.die('Unable to find completion file: {}'.format(e))
