import secrets

import click
from cryptography.fernet import Fernet
from dotenv import load_dotenv

from app import create_app
from app.extensions import db
from app.models import AdminUser

load_dotenv()
app = create_app()


@app.cli.command("init-db")
def init_db_command():
    """Create all database tables."""
    with app.app_context():
        db.create_all()
    click.echo("Database initialized.")


@app.cli.command("create-admin")
@click.option("--username", prompt=True)
@click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)
def create_admin_command(username: str, password: str):
    """Create or update an admin user."""
    with app.app_context():
        db.create_all()
        admin = AdminUser.query.filter_by(username=username).first()
        if admin is None:
            admin = AdminUser(username=username)
            db.session.add(admin)
        admin.set_password(password)
        db.session.commit()
    click.echo(f"Admin ready: {username}")


@app.cli.command("generate-secrets")
def generate_secrets_command():
    """Print secure values for the .env file."""
    click.echo(f"SECRET_KEY={secrets.token_urlsafe(48)}")
    click.echo(f"APP_ENCRYPTION_KEY={Fernet.generate_key().decode()}")
    click.echo(f"KEY_HASH_PEPPER={secrets.token_urlsafe(48)}")


if __name__ == "__main__":
    app.run(debug=True)
