import logging
import click

from flask import Flask
from flask.cli import AppGroup, run_command

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

log = logging.getLogger(__name__)

data_cli = AppGroup('data', help='Sample data initialization')
users_cli = AppGroup('users', help='Users management')
devel_cli = AppGroup('devel', help='Development options')

app: Flask = create_app()
app.cli.add_command(data_cli)
app.cli.add_command(users_cli)
app.cli.add_command(devel_cli)


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


@users_cli.command('create')
@click.argument('name')
def cli_users_create(name):
    with 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_set_password(name):
    with 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}")


@users_cli.command('delete')
@click.argument('name')
def cli_users_set_password(name):
    with app.app_context():
        log.info(f"[CMD] Delete user: {name}")
        ask: str = click.prompt('Type Y/y for confirmation', hide_input=True)
        if ask.lower()[0] != 'y':
            return
        user = find_user(name)
        general.delete_entity(user)
        log.info(f"[CMD] User deleted: {name}")


@devel_cli.command('run')
@click.option('-p', '--port', default=8000)
@click.pass_context
def cli_run_devel(ctx, port):
    db.drop_all(app=app)
    db.create_all(app=app)
    data.init_data(app, db)
    ctx.forward(run_command, port)


if __name__ == '__main__':
    cli_run_devel()