"""Gerencia contas do emulador.

    python contas.py listar
    python contas.py criar <usuario> <senha>
    python contas.py senha <usuario> <senha>      -- troca a senha
    python contas.py bloquear <usuario>
    python contas.py liberar <usuario>
"""
import sys

# Este script vive em admin/ mas usa o db.py do servidor, que fica em server/.
# Sem esta linha o import falha quando roda de qualquer pasta que nao seja server/.
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                "..", "server"))

import db


def listar() -> None:
    con = db._conectar()
    if con is None:
        print("sem banco")
        return
    cur = con.cursor()
    cur.execute("""SELECT c.conta_id, c.usuario,
                          CASE WHEN c.senha_hash IS NULL THEN 'SEM SENHA' ELSE 'definida' END,
                          c.bloqueada, c.ultimo_login_em, c.ultimo_ip,
                          (SELECT COUNT(*) FROM dbo.personagem p WHERE p.conta_id = c.conta_id)
                     FROM dbo.conta c ORDER BY c.conta_id""")
    print(f"{'id':>3}  {'usuario':<20} {'senha':<10} {'bloq':<5} {'pers':>4}  ultimo login (UTC)")
    for cid, usr, senha, bloq, quando, ip, npers in cur.fetchall():
        q = quando.strftime("%d/%m %H:%M") if quando else "-"
        print(f"{cid:>3}  {usr:<20} {senha:<10} {'sim' if bloq else 'nao':<5} {npers:>4}  {q}  {ip or ''}")


def main() -> int:
    if len(sys.argv) < 2:
        print(__doc__)
        return 1
    cmd = sys.argv[1]
    if cmd == "listar":
        listar()
        return 0

    if cmd in ("criar", "senha") and len(sys.argv) == 4:
        usuario, senha = sys.argv[2], sys.argv[3]
        if cmd == "criar":
            res, cid = db.autenticar(usuario, senha)
            if res == "ok":
                print(f"conta '{usuario}' pronta (conta_id={cid})")
                return 0
            print(f"nao criou: {res} (a conta ja existe? use 'senha' para trocar)")
            return 1
        if db.definir_senha(usuario, senha):
            print(f"senha de '{usuario}' trocada")
            return 0
        print(f"conta '{usuario}' nao encontrada")
        return 1

    if cmd in ("bloquear", "liberar") and len(sys.argv) == 3:
        con = db._conectar()
        if con is None:
            print("sem banco")
            return 1
        cur = con.cursor()
        cur.execute("UPDATE dbo.conta SET bloqueada = ? WHERE usuario = ?",
                    1 if cmd == "bloquear" else 0, sys.argv[2])
        print(f"{sys.argv[2]}: {'bloqueada' if cmd == 'bloquear' else 'liberada'}"
              if cur.rowcount else "conta nao encontrada")
        return 0

    print(__doc__)
    return 1


if __name__ == "__main__":
    sys.exit(main())
