"""Administra personagens e reservas de nome.

    python personagens.py listar
    python personagens.py apagar <entity_id>
    python personagens.py nomes
    python personagens.py liberar-nome <nome>    -- derruba a reserva permanente

O jogo NUNCA libera um nome: quem usou, usou. `liberar-nome` existe so para administracao.
"""
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():
    con = db._conectar()
    if con is None:
        print("sem banco"); return
    cur = con.cursor()
    cur.execute("""SELECT c.usuario, p.entity_id, p.nome, cl.nome, p.nivel, p.exp,
                          p.hp_max, p.mp_max
                     FROM dbo.personagem p
                     JOIN dbo.conta c ON c.conta_id = p.conta_id
                     JOIN dbo.classe cl ON cl.classe_id = p.classe
                    ORDER BY c.usuario, p.personagem_id""")
    linhas = cur.fetchall()
    if not linhas:
        print("nenhum personagem"); return
    print(f"{'conta':<14} {'id':>6} {'nome':<16} {'classe':<12} {'nv':>3} {'exp':>6} {'HP':>5} {'MP':>5}")
    for u, e, n, cl, nv, ex, hp, mp in linhas:
        print(f"{u:<14} {e:>6} {n:<16} {cl:<12} {nv:>3} {ex:>6} {hp:>5} {mp:>5}")


def nomes():
    con = db._conectar()
    if con is None:
        print("sem banco"); return
    cur = con.cursor()
    cur.execute("SELECT nome, entity_id, personagem_vivo, reservado_em "
                "FROM dbo.nome_reservado ORDER BY reservado_em")
    print(f"{'nome':<18} {'entity':>7}  estado")
    for n, e, vivo, quando in cur.fetchall():
        print(f"{n:<18} {e if e else '-':>7}  {'em uso' if vivo else 'reservado (apagado)'}")


def main() -> int:
    if len(sys.argv) < 2:
        print(__doc__); return 1
    cmd = sys.argv[1]
    if cmd == "listar":
        listar(); return 0
    if cmd == "nomes":
        nomes(); return 0
    if cmd == "apagar" and len(sys.argv) == 3:
        ok = db.apagar_personagem(int(sys.argv[2]))
        print("apagado (o nome continua reservado)" if ok else "nao encontrei esse entity_id")
        return 0 if ok else 1
    if cmd == "liberar-nome" and len(sys.argv) == 3:
        con = db._conectar()
        if con is None:
            print("sem banco"); return 1
        cur = con.cursor()
        cur.execute("DECLARE @n INT; EXEC dbo.liberar_nome ?, @n OUTPUT; SELECT @n;", sys.argv[2])
        n = int(cur.fetchone()[0])
        if n < 0:
            print("existe personagem VIVO com esse nome -- apague o personagem antes")
        else:
            print(f"nome '{sys.argv[2]}' liberado" if n else "esse nome nao estava reservado")
        return 0
    print(__doc__); return 1


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