import click
import logging
from flask import Flask
from flask.cli import AppGroup

from portal import db
from management import data
from management.data import shared
from portal.service.general import find_user

log = logging.getLogger(__name__)

data_cli = AppGroup('data')
users_cli = AppGroup('users')

flask_app: Flask = None


def register_commands(app: Flask):
    global flask_app
    app.cli.add_command(data_cli)
    app.cli.add_command(users_cli)
    flask_app = app
    return app


@data_cli.command('init')
def cli_init_data():
    log.info("[CMD] Initializing data")
    log.debug(f"[CONFIG] DB: {flask_app.config['SQLALCHEMY_DATABASE_URI']}")
    data.init_data(db=db, app=flask_app)


@users_cli.command('create')
@click.argument('name')
def cli_users_create(name):
    with flask_app.app_context():
        log.info(f"[CMD] Create user: {name}")
        password = click.prompt('Password', hide_input=True, confirmation_prompt=True)
        creator = shared.DataCreator(db)
        user = creator.create_user(
            username=name,
            name=name,
            admin=True,
            password=password
            )
        db.session.commit()
        log.info(f"[CMD] Created user: {user}")


@users_cli.command('set-password')
@click.argument('name')
def cli_users_create(name):
    with flask_app.app_context():
        log.info(f"[CMD] Update password for user: {name}")
        password = click.prompt('Password', hide_input=True, confirmation_prompt=True)
        user = find_user(name)
        user.set_password(password=password)
        db.session.add(user)
        db.session.commit()
        log.info(f"[CMD] Updated password for user: {user}")