#!/usr/bin/python3

# Author: Louis Holbrook <dev@holbrook.no> (https://holbrook.no)
# Description: cli interface for a subset of sempo platform functions
# SPDX-License-Identifier: GPL-3.0-or-later

# standard imports
import os
import sys
import argparse
import logging
from xdg import XDG_CONFIG_HOME

# third-party imports
from confini import Config
from sempo_client import ApiClient

# local imports
import sempo_cli.cmd.kyc as cmd_kyc
import sempo_cli.cmd.tx as cmd_tx
import sempo_cli.cmd.reclaim as cmd_reclaim
import sempo_cli.cmd.location as cmd_location
import sempo_cli.cmd.user as cmd_user
import sempo_cli.cmd.sms as cmd_sms

logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()

config_dir = os.path.join(XDG_CONFIG_HOME, 'sempo-cli')

argparser = argparse.ArgumentParser(description='CLI tool to interface the Sempo API')
argparser.add_argument('-c', type=str, default=config_dir, help='config root to use')
argparser.add_argument('-d', type=str, default='local', help='deployment name to interface (config root subdirectory)')
argparser.add_argument('-o', type=int, help='organisation id to query')
argparser.add_argument('--host', type=str, default='localhost')
argparser.add_argument('--port', type=int, default=9000)
argparser.add_argument('--nossl', help='do not use ssl (careful)', action='store_true')
argparser.add_argument('-v', help='be verbose', action='store_true')
argparser.add_argument('-vv', help='be more verbose', action='store_true')

sub = argparser.add_subparsers()
sub.dest = 'command'
sub_kyc = sub.add_parser('kyc', help='manipulate kyc applications')
cmd_kyc.process_args(sub_kyc)
sub_tx = sub.add_parser('tx', help='send sarafu to user')
cmd_tx.process_args(sub_tx)
sub_reclaim = sub.add_parser('reclaim', help='reclaim sarafu from user')
cmd_reclaim.process_args(sub_reclaim)
sub_location = sub.add_parser('location', help='query and manipulate location data')
cmd_location.process_args(sub_location)
sub_user = sub.add_parser('user', help='query and manipulate user data')
cmd_user.process_args(sub_user)
sub_sms = sub.add_parser('sms', help='view sms log')
cmd_sms.process_args(sub_sms)

args = argparser.parse_args(sys.argv[1:])

if args.v == True:
    logging.getLogger().setLevel(logging.INFO)
elif args.vv == True:
    logging.getLogger().setLevel(logging.DEBUG)

if args.command == None:
    logg.critical('Subcommand missing')
    sys.exit(1)

config_dir = os.path.join(args.c, args.d)
os.makedirs(config_dir, 0o777, True)

config = Config(config_dir)
config.process()
logg.debug('config loaded from {}'.format(config_dir))

if args.o == None:
    setattr(args, 'o', config.get('CLIENT_DEFAULT_ORGANISATION'))

# TODO: add default command
cmd_mod = None
subcmd = args.command
if subcmd == 'kyc':
    cmd_mod = cmd_kyc
elif subcmd == 'tx':
    cmd_mod = cmd_tx
elif subcmd == 'reclaim':
    cmd_mod = cmd_reclaim
#elif subcmd == 'location':
#    cmd_mod = cmd_location
elif subcmd == 'user':
    cmd_mod = cmd_user
elif subcmd == 'sms':
    cmd_mod = cmd_sms

cmd_mod.validate_args(args)


if __name__ == '__main__':
    otp_secret = config.get('CLIENT_OTP_SECRET')
    client = ApiClient(host=args.host, port=args.port, use_ssl=not args.nossl, otp_secret=otp_secret)

    client.authorize(config.get('CLIENT_EMAIL'), config.get('CLIENT_PASSWORD'))
 
    cmd_mod.execute(client, config, args)
    #try:
    #    cmd_mod.execute(client, config, args)
    #except ValueError as e:
    #    logg.error('{}'.format(e))
    #    sys.exit(1)
