from fisco_bcos_toolbox import create_app
from fisco_bcos_toolbox.extensions import db
from fisco_bcos_toolbox.models import User, Contract

from flask_script import Manager, Server, Shell
import click
app = create_app()

banner = r"""
 ______     ________      ______       ______       ______          _______       ______       ______       ______      
/_____/\   /_______/\    /_____/\     /_____/\     /_____/\       /_______/\     /_____/\     /_____/\     /_____/\     
\::::_\/_  \__.::._\/    \::::_\/_    \:::__\/     \:::_ \ \      \::: _  \ \    \:::__\/     \:::_ \ \    \::::_\/_    
 \:\/___/\    \::\ \      \:\/___/\    \:\ \  __    \:\ \ \ \      \::(_)  \/_    \:\ \  __    \:\ \ \ \    \:\/___/\   
  \:::._\/    _\::\ \__    \_::._\:\    \:\ \/_/\    \:\ \ \ \      \::  _  \ \    \:\ \/_/\    \:\ \ \ \    \_::._\:\  
   \:\ \     /__\::\__/\     /____\:\    \:\_\ \ \    \:\_\ \ \      \::(_)  \ \    \:\_\ \ \    \:\_\ \ \     /____\:\ 
    \_\/     \________\/     \_____\/     \_____\/     \_____\/       \_______\/     \_____\/     \_____\/     \_____\/ 
                
"""

manager = Manager(app)

def make_shell_context():
    return {
        "app": app,
    }

manager.add_command("runserver", Server(host="0.0.0.0", port=5000, use_debugger=True))
manager.add_command("shell", Shell(banner=banner, make_context=make_shell_context))


@manager.command
def reset_db():
    """Initialize the database."""
        
    click.confirm('This operation will delete the database, do you want to continue?', abort=True)
    db.drop_all()
    click.echo('Drop tables.')
    db.create_all()
    
    init_db()

@manager.command
def init_db():
    db.create_all()
    click.echo('Initialized database.')
    admin = User(
        username='admin',
        email='admin@admin.com',
        is_admin=True,
        active=True,
    )
    admin.set_password('admin')
    db.session.add(admin)
    db.session.commit()
    click.echo('Success Add Admin Count.')

    contract_evi = Contract(
        name="存证合约",
        description = "WeBase 自带的存证合约,可用于存证、溯源、供应链等应用。",
        path="contracts/Evidence"
    )

    db.session.add(contract_evi)
    db.session.commit()
    click.echo('Success Add Contract.')

@manager.command
def set_user(username, email, password, active=True):
    """Add A New User."""
    if User.query.filter(User.username==username).first() and User.query.filter(User.email==email).first() and active:
        user = User.query.filter(User.username==username).first()
        user.active = True
        click.echo('Success Update A New User to Active')
    else:
        user = User(username=username, email=email, active=active, id=None)
        # add a User(active = False)
        user.set_password(password)
        user.set_password(password)
        db.session.add(user)
        db.session.commit(user)
        click.echo("Success Add A New Active User.")

if __name__ == "__main__":
    manager.run()