# -*- coding: utf-8 -*-
"""Administra as maquinas autorizadas de uma conta.

    python admin/dispositivos.py listar <conta>
    python admin/dispositivos.py liberar <conta>            esquece TODAS as maquinas
    python admin/dispositivos.py liberar <conta> <hash1>    esquece so aquela

O Karos limita a conta a 3 computadores. O client manda dois MD5 (hash1/hash2) no pacote de
login, e o servidor guarda um par por maquina em dbo.conta_dispositivo. Passando de tres, o
login e recusado e o jogador precisa pedir liberacao -- e para isso que este script existe.

Liberar TODAS e o caminho normal do atendimento: o jogador troca de computador, perde
acesso, e o operador zera a lista para ele registrar as maquinas de novo nos proximos
tres logins.
"""
# 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  # noqa: E402


def listar(usuario: str) -> int:
    linhas = db.dispositivos_da_conta(usuario)
    if not linhas:
        print("conta '%s': nenhuma maquina registrada "
              "(ou a conta nao existe)" % usuario)
        return 0
    print("conta '%s': %d de %d maquinas" % (usuario, len(linhas), db.MAX_DISPOSITIVOS))
    print()
    print("%-34s %-20s %s" % ("hash1", "primeiro uso", "ultimo uso"))
    print("-" * 76)
    for d in linhas:
        print("%-34s %-20s %s" % (d["hash1"],
                                  str(d["primeiro_uso"])[:19],
                                  str(d["ultimo_uso"])[:19] if d["ultimo_uso"] else "-"))
    if len(linhas) >= db.MAX_DISPOSITIVOS:
        print()
        print("COTA CHEIA: um login de maquina nova sera recusado.")
    return 0


def liberar(usuario: str, hash1: str | None) -> int:
    antes = db.dispositivos_da_conta(usuario)
    if not antes:
        print("conta '%s': nada a liberar" % usuario)
        return 0
    n = db.liberar_dispositivos(usuario, hash1)
    if hash1:
        print("conta '%s': %d maquina(s) com hash1=%s esquecida(s)" % (usuario, n, hash1))
    else:
        print("conta '%s': %d maquina(s) esquecida(s) -- as proximas %d que entrarem "
              "voltam a ser registradas" % (usuario, n, db.MAX_DISPOSITIVOS))
    return 0


def main() -> int:
    if len(sys.argv) < 3:
        print(__doc__)
        return 2
    acao, usuario = sys.argv[1].lower(), sys.argv[2]
    if acao == "listar":
        return listar(usuario)
    if acao == "liberar":
        return liberar(usuario, sys.argv[3] if len(sys.argv) > 3 else None)
    print("acao desconhecida: %s" % acao)
    print(__doc__)
    return 2


if __name__ == "__main__":
    raise SystemExit(main())
