#!/usr/bin/env python3
# coding=utf-8
"""An example demonstrating how use one of cmd2's argument parsing decorators"""

import argparse
import os

import cmd2


class ArgparsingApp(cmd2.Cmd):
    def __init__(self):
        super().__init__(include_ipy=True)
        self.intro = 'cmd2 has awesome decorators to make it easy to use Argparse to parse command arguments'

    # do_fsize parser
    fsize_parser = cmd2.Cmd2ArgumentParser(description='Obtain the size of a file')
    fsize_parser.add_argument('-c', '--comma', action='store_true', help='add comma for thousands separator')
    fsize_parser.add_argument('-u', '--unit', choices=['MB', 'KB'], help='unit to display size in')
    fsize_parser.add_argument('file_path', help='path of file', completer=cmd2.Cmd.path_complete)

    @cmd2.with_argparser(fsize_parser)
    def do_fsize(self, args: argparse.Namespace) -> None:
        """Obtain the size of a file"""
        expanded_path = os.path.expanduser(args.file_path)

        try:
            size = os.path.getsize(expanded_path)
        except OSError as ex:
            self.perror("Error retrieving size: {}".format(ex))
            return

        if args.unit == 'KB':
            size /= 1024
        elif args.unit == 'MB':
            size /= 1024 * 1024
        else:
            args.unit = 'bytes'
        size = round(size, 2)

        if args.comma:
            size = '{:,}'.format(size)
        self.poutput('{} {}'.format(size, args.unit))

    # do_pow parser
    pow_parser = cmd2.Cmd2ArgumentParser()
    pow_parser.add_argument('base', type=int)
    pow_parser.add_argument('exponent', type=int, choices=range(-5, 6))

    @cmd2.with_argparser(pow_parser)
    def do_pow(self, args: argparse.Namespace) -> None:
        """
        Raise an integer to a small integer exponent, either positive or negative

        :param args: argparse arguments
        """
        self.poutput('{} ** {} == {}'.format(args.base, args.exponent, args.base**args.exponent))


if __name__ == '__main__':
    app = ArgparsingApp()
    app.cmdloop()
