#!/usr/bin/env python
"""Utility script for interacting with SDC2 scoring service admin functions."""
import os
import logging

import sys
import string
import argparse
import random

from ska_sdc2_scoring_utils import admin_api
from ska_sdc2_scoring_utils.logs import init_logger

SDC_SCORE_AUTH_HOST = os.getenv("SDC_SCORE_AUTH_HOST", "130.246.212.32")
SDC_SCORE_AUTH_PORT = os.getenv("SDC_SCORE_AUTH_PORT", "8080")
SDC_SCORE_API_HOST = os.getenv("SDC_SCORE_API_HOST", "130.246.212.180")
SDC_SCORE_API_PORT = os.getenv("SDC_SCORE_API_PORT", "3000")

LOG = logging.getLogger(__name__)


def add_group_commands(subparsers):
    """Group (Team) commands"""
    # GET
    subparser = subparsers.add_parser("list-groups", help="List the current groups.")
    subparser.add_argument(
        "--users", "-u", action="store_true", help="Display users in each group."
    )

    # POST (ADD)
    subparser = subparsers.add_parser("add-group", help="Add a group.")
    subparser.add_argument("name", metavar="NAME", nargs="+", help="Name of the group.")

    # DELETE
    subparser = subparsers.add_parser("delete-group", help="Remove a group.")
    subparser.add_argument("name", metavar="NAME", nargs="+", help="Name of the group.")


def process_group_commands(args):
    """Process group commands."""
    if args.command == "list-groups":
        admin_api.group_list(show_users=args.users)

    if args.command == "add-group":
        admin_api.group_add(args.name)

    if args.command == "delete-group":
        admin_api.group_delete(args.name)


def add_user_commands(subparsers):
    """Group (Team) commands"""
    # GET
    subparser = subparsers.add_parser("list-users", help="List the current users.")

    # POST (ADD)
    subparser = subparsers.add_parser("add-user", help="Add a user.")
    subparser.add_argument("first_name", metavar="FIRST_NAME", help="First name.")
    subparser.add_argument("last_name", metavar="LAST_NAME", help="Last name.")
    subparser.add_argument("username", metavar="USERNAME", help="Username.")
    subparser.add_argument("email", metavar="EMAIL", help="Email.")
    subparser.add_argument(
        "group_name", metavar="GROUP NAME", nargs="+", help="Group name."
    )
    subparser.add_argument(
        "--password", "-p", help="Password (if not set this is auto=generated)"
    )

    # DELETE
    subparser = subparsers.add_parser("delete-user", help="Remove a user.")
    subparser.add_argument("username", metavar="USERNAME", help="Username.")


def process_user_commands(args):
    """Process group commands."""
    if args.command == "list-users":
        admin_api.user_list()

    if args.command == "add-user":
        password = args.password
        # Generate random password, if not provided
        if not password:
            password_chars = string.ascii_letters + string.punctuation + string.digits
            password = "".join(
                random.choice(password_chars) for x in range(random.randint(8, 16))
            )
        admin_api.user_add(
            args.first_name,
            args.last_name,
            args.username,
            password,
            args.email,
            args.group_name,
        )

    if args.command == "delete-user":
        admin_api.user_delete(args.username)


def set_up_arg_parser():
    """."""
    parser = argparse.ArgumentParser("sdc2-score-admin")

    parser.add_argument(
        "--verbose",
        "-v",
        action="store_true",
        help="Display additional debugging inforomation",
    )

    subparsers = parser.add_subparsers(help="commands", dest="command")

    add_group_commands(subparsers)
    add_user_commands(subparsers)

    return parser


def main():
    """."""
    parser = set_up_arg_parser()
    args = parser.parse_args()

    init_logger(logging.DEBUG if args.verbose else logging.INFO, args.verbose)

    process_group_commands(args)
    process_user_commands(args)

    if len(sys.argv) < 2:
        parser.print_usage()
        # parser.print_help()
        sys.exit(1)


if __name__ == "__main__":
    main()
