# -*- coding: utf-8 -*-
r"""Mostra os atributos de um item nivel a nivel de refino, no nosso client e no Arena.

    python tools/ver_refino.py 5001            um item
    python tools/ver_refino.py 5001 16001      varios
    python tools/ver_refino.py --nome bengala  procura pelo nome

As colunas sao os 13 doubles do registo do itemAttr, na ordem em que estao no ficheiro.
Os que sobem com o refino: dano fisico min/max, dano magico min/max, defesa, def.magica e
o bonus9. Os que ficam parados: velocidade de ataque, alcance e bonus12 -- medido no Arena,
0 de 973 itens mexem a velocidade ao refinar.
"""
import argparse
import os
import struct
import sys

RAIZ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(RAIZ, "tools"))
sys.path.insert(0, os.path.join(RAIZ, "server"))
import lod_crypto as L                                              # noqa: E402

NOSSO = r"C:\Games\Axion\ResUnpak\Interface\IE_Lod\itemAttr.lod_pt"
ARENA = r"C:\Games\Arena\ResUnpak\Interface\IE_Lod\itemAttr.lod_en"
COLS = [("dano", 12), ("dano+", 20), ("mag", 28), ("mag+", 36), ("vel", 44),
        ("alc", 52), ("def", 60), ("defM", 68), ("b8", 76), ("b9", 84),
        ("b10", 92), ("b11", 100), ("b12", 108)]
MOSTRA = ["dano", "dano+", "mag", "mag+", "vel", "def", "defM", "b9"]


def ler(cam, xor=0):
    d = L.decrypt_lod_stream(open(cam, "rb").read(), pular_zero=False, xor=xor)
    _v, tot = struct.unpack_from("<II", d, 0)
    pos, out = 8, {}
    for _ in range(tot):
        iid, ref, _e = struct.unpack_from("<3I", d, pos)
        out[(iid, ref)] = {n: struct.unpack_from("<d", d, pos + o)[0] for n, o in COLS}
        pos += 116
        for _s in range(2):
            (t,) = struct.unpack_from("<I", d, pos)
            pos += 4 + t
    return out


def main() -> int:
    ap = argparse.ArgumentParser(description="Atributos por nivel de refino, nosso vs Arena.")
    ap.add_argument("itens", nargs="*", type=int)
    ap.add_argument("--nome", help="procura itens cujo nome contenha isto")
    args = ap.parse_args()

    alvos = list(args.itens)
    nomes = {}
    try:
        import data_files
        for r in data_files.tabela("Item"):
            nomes[int(r["item_id"])] = str(r.get("nome") or "")
        if args.nome:
            achados = [i for i, n in nomes.items() if args.nome.lower() in n.lower()]
            print("%d item(ns) com '%s': %s"
                  % (len(achados), args.nome,
                     ", ".join("%d %s" % (i, nomes[i]) for i in sorted(achados)[:12])))
            alvos += sorted(achados)[:3]
    except Exception as e:                                          # noqa: BLE001
        print("(sem nomes: %s)" % str(e)[:60])
    if not alvos:
        ap.error("de um item_id ou --nome")

    N, A = ler(NOSSO), ler(ARENA, L.XOR_ARENA)
    for iid in alvos:
        print("\n=== %d %s ===" % (iid, nomes.get(iid, "")))
        cab = "  ".join("%7s" % c for c in MOSTRA)
        print("ref |%s |%s" % (cab, cab))
        print("    |%s |%s" % (" " * len(cab), " " * len(cab)))
        print("    | NOSSO%s| ARENA" % (" " * (len(cab) - 6)))
        for r in range(19):
            n, a = N.get((iid, r)), A.get((iid, r))
            if not n and not a:
                continue
            fn = "  ".join("%7.2f" % n[c] for c in MOSTRA) if n else " " * len(cab)
            fa = "  ".join("%7.2f" % a[c] for c in MOSTRA) if a else "(nao tem)"
            print(" %2d |%s |%s" % (r, fn, fa))
    return 0


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