import json
import os

import click
from flask import Flask

from flask_api_auth import Authentication
from flask_api_auth.models import APIUser, APIRole

app = Flask(__name__)
app.config.from_object(os.getenv('APP_CONFIG'))

Authentication(app)


@click.command()
@click.argument('apiuser')
@click.argument('key')
@click.argument('apiroles')
def create_apiuser(*args, **kwargs):
    """
    Command for create APIUser.
    Syntax:
    # flask create-apiuser <username> <key> <comma-separed-roles>
    Examples:
    $ flask create-apiuser natgeo_user 1234 admin
    $ flask create-apiuser natgeo_user 1234 admin,staff
    """
    apiuser_data = {
        "is_active": True,
        "is_superuser": False,
        "name": kwargs['apiuser'],
        "key": kwargs['key'],
        "roles": kwargs['apiroles'].split(',')
    }

    APIUser(apiuser_data).save()


@click.command()
@click.argument('apirole')
@click.argument('permissions')
def create_apirole(*args, **kwargs):
    """
    Command for create APIRole.
    Syntax:
    # flask create-apirole <role_name> <valid_json between single quotes>
    Example:
    flask create-apirole admin '{"read_only": "true"}'
    """
    try:
        permissions = json.loads(kwargs['permissions'])
    except (ValueError, TypeError):
        permissions = {}

    apirole_data = {
        "is_active": True,
        "name": kwargs['apirole'],
        "permissions": permissions
    }
    APIRole(apirole_data).save()
