"""Command line: python manage.py <command>   (run `python manage.py help`)"""
import argparse
import getpass
import secrets
import sys

from werkzeug.security import generate_password_hash


def main():
    ap = argparse.ArgumentParser(description='Bazras management')
    sub = ap.add_subparsers(dest='cmd')
    for c in ('migrate', 'seed', 'backup', 'run-jobs', 'list-backups', 'show-outbox', 'gen-secret', 'hash-password',
              'create-admin', 'help'):
        sub.add_parser(c)
    sub.choices['seed'].add_argument('--force', action='store_true', help='re-import missing bazras.json rows only')
    r = sub.add_parser('restore')
    r.add_argument('backup_id', type=int)
    rs = sub.add_parser('runserver')
    rs.add_argument('--host', default='0.0.0.0')
    rs.add_argument('--port', type=int, default=5000)
    args = ap.parse_args()
    if args.cmd in (None, 'help'):
        ap.print_help()
        return
    if args.cmd == 'gen-secret':
        print(secrets.token_urlsafe(48))
        return
    if args.cmd == 'hash-password':
        pw = getpass.getpass('Password: ')
        print(generate_password_hash(pw))
        return

    from app import create_app, db as dbmod, seed
    from app.config import build_config
    app = create_app({'SCHEDULER_ENABLED': False}) if args.cmd != 'runserver' else create_app()
    cfg = app.config
    if args.cmd == 'migrate':
        with dbmod.open_db(cfg['DATABASE_PATH']) as d:
            print('applied:', dbmod.migrate(d) or 'nothing (up to date)')
    elif args.cmd == 'seed':
        with dbmod.open_db(cfg['DATABASE_PATH']) as d:
            seed.ensure_seed(d, cfg, force=args.force)
        print('seed done (idempotent)')
    elif args.cmd == 'create-admin':
        from app import userlib
        uname = input(f"Username [{cfg['ADMIN_USERNAME']}]: ").strip() or cfg['ADMIN_USERNAME']
        pw = getpass.getpass('Password (min 6): ')
        with dbmod.open_db(cfg['DATABASE_PATH']) as d:
            if d.val('SELECT 1 FROM users WHERE username_lower=?', (uname.lower(),)):
                sys.exit('user already exists')
            hq = d.val("SELECT id FROM cities WHERE kind='hq' ORDER BY id LIMIT 1")
            userlib.create_user(d, dict(username=uname, first_name='مدیر', last_name='سامانه', password=pw, city_id=hq),
                                ['administrator'], 'active', None, 1)
        print('Administrator created')
    elif args.cmd == 'backup':
        from app.backup import create_backup
        print(create_backup(cfg, 'manual'))
    elif args.cmd == 'restore':
        from app.backup import restore_backup
        restore_backup(cfg, args.backup_id, None)
        print('restored')
    elif args.cmd == 'run-jobs':
        from app.scheduler import run_jobs
        print(run_jobs(cfg, force=True))
    elif args.cmd == 'list-backups':
        with dbmod.open_db(cfg['DATABASE_PATH']) as d:
            for b in d.all('SELECT id,file_name,size_bytes,kind,status,created_at FROM database_backups ORDER BY id DESC'):
                print(b)
    elif args.cmd == 'show-outbox':
        with dbmod.open_db(cfg['DATABASE_PATH']) as d:
            for m in d.all('SELECT * FROM outbox ORDER BY id DESC LIMIT 20'):
                print(m)
    elif args.cmd == 'runserver':
        app.run(host=args.host, port=args.port, debug=False)


if __name__ == '__main__':
    main()
