# -*- coding: utf-8 -*-
"""Poe um item na mochila de um personagem, pela linha de comando.

    python tools/dar_item.py <personagem> <item_id> [quantidade] [refino]

A montagem do registo de 147 bytes VIVE EM db.dar_item, nao aqui. Passou para la em 28/08,
quando a ferramenta web (admin/web.py) passou a precisar do mesmo caminho: duas copias
seriam duas para corrigir de cada vez que um campo novo fosse decifrado, e a que ninguem
estivesse a olhar ficaria para tras em silencio.

Para escolher as caracteristicas especiais do item, use a ferramenta web -- a linha de
comando nao as pede.

Campos do registo, para referencia:

    [0]      container (1 = mochila)      [1]     slot
    [2:6]    item_id u32 LE               [6]     slot de equipamento (0 = na mochila)
    [7]      REFINO -- ver abaixo         [8:12]  serial da instancia
    [12:16]  data de criacao              [16:20] quantidade u32 LE

O byte [7] e HIPOTESE, nao medido: nenhum item das capturas era refinado, entao nao havia
onde comparar. O que sustenta o palpite vem do binario -- o handler da lista de inventario
(FUN_00657e08) le `_Src[6]` e `_Src[7]` como campos SEPARADOS e joga o segundo em +0xf3 do
objeto item, e o handler do equipar (FUN_00652797) enche esse mesmo +0xf3 com o byte 17 do
pacote 06 00. Como o 06 00 tem 18 bytes e o 06 01 so 17, esse campo extra existe justamente
no equipar. Se ao entrar no jogo o item nao aparecer com o "+N", o palpite estava errado e
o candidato seguinte e outro byte da mesma faixa.
"""
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "server"))
import data_files as D                                              # noqa: E402
import db                                                           # noqa: E402


def main() -> int:
    if len(sys.argv) < 3:
        print(__doc__)
        return 2
    nome = sys.argv[1]
    item_id = int(sys.argv[2])
    qtd = int(sys.argv[3]) if len(sys.argv) > 3 else 1
    refino = int(sys.argv[4]) if len(sys.argv) > 4 else 0

    D.carregar()
    con = db._conectar()
    if con is None:
        print("sem banco")
        return 1
    cur = con.cursor()
    cur.execute("SELECT entity_id, classe, nivel FROM dbo.personagem WHERE nome = ?", nome)
    linha = cur.fetchone()
    if linha is None:
        print(f"nao achei o personagem '{nome}'")
        return 1
    ent, classe, nivel = linha

    ficha = D.indice("Item", "item_id").get(item_id)
    if ficha is None:
        print(f"item {item_id} nao esta em Data/Item.ini")
        return 1
    print(f"{nome} (entidade {ent}, classe {classe}, nivel {nivel})")
    print(f"item {item_id}: {ficha.get('nome')!r}  classe_req={ficha.get('classe_req')} "
          f"nivel_req={ficha.get('nivel_req')} slot={ficha.get('slot')}")
    if ficha.get("classe_req") and classe and ficha["classe_req"] != classe:
        print(f"  AVISO: item e da classe {ficha['classe_req']}, o personagem e da {classe}")

    # --dias N para item temporario; sem ele nasce permanente (validade zero)
    dias = 0
    for k, a in enumerate(sys.argv):
        if a == "--dias" and k + 1 < len(sys.argv):
            dias = int(sys.argv[k + 1])
    r = db.dar_item(ent, item_id, qtd, refino, dias=dias)
    if not r["ok"]:
        print("falhou: %s" % r["erro"])
        return 1
    print(f"posto na mochila, slot {r['slot']}, quantidade {qtd}, refino +{refino} "
          f"(instancia {r['instancia']})")

    linha = next((x for x in D.tabela("ItemOption")
                  if x["item_id"] == item_id and x.get("refino") == refino), None)
    if linha:
        print("atributos no +%d: dano %.2f-%.2f  vel %.3f  alcance %.0f  defesa %.0f"
              % (refino, linha["dano_min"], linha["dano_max"], linha["vel_ataque"],
                 linha["alcance"], linha["defesa"]))
    else:
        print("sem atributos em ItemOption para o item %d no refino %d" % (item_id, refino))

    fixos = D.agrupar_composto("ItemBonus", ("item_id", "refino")).get((item_id, refino), [])
    for l in fixos:
        print("   caracteristica fixa: %-34s +%.2f%s"
              % (l["nome"], float(l["valor"]), "%" if l.get("unidade") == "%" else ""))
    return 0


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