# -*- coding: utf-8 -*-
"""Importa fletaAttr.lod para dbo.fleta: a arvore de Fleta e o efeito de cada fase.

Decifrado em 24/08 com o jogador pondo um ponto ao vivo e mandando o print do tooltip.
Registro de 40 bytes, cabecalho de 4 (a contagem: 42):

    [ 0:4 ] grupo       1 ou 2
    [ 4:8 ] elemento    1..2 no grupo 1, 1..5 no grupo 2  -> 7 elementos, bate com a tela
    [ 8:12] fase        1..6
    [12:16] custo       10, 100, 200, 400, 800, 1600 pontos
    [16:20] skill_id    o efeito, que vive em dbo.skill
    [20:24] tipo        0, e 1 ou 2 na ultima fase

A confirmacao veio do tooltip: o jogador pos um ponto no elemento "Ar" e a tela mostrou
"Ar [Ur. 1] Velocidade de ataque + 9%". O skill_id 50021 fase 1 em dbo.skill diz
exatamente "Velocidade de ataque + 9%".

Consequencia que vale alem da Fleta: os efeitos SAO skills. A dbo.skill, que eu vinha
tratando como "so catalogo de texto", e o dicionario de efeitos do jogo inteiro.
"""
import os
import struct
import sys

import pyodbc

sys.path.insert(0, r"D:\RoshEmulator\server")
import lod_crypto  # noqa: E402

BASE = r"C:\Games\Karos\ResUnpak\Interface\IE_Lod"
CONEXAO = ("DRIVER={ODBC Driver 18 for SQL Server};SERVER=localhost;"
           "DATABASE=Rosh;Trusted_Connection=yes;TrustServerCertificate=yes")
TAM = 40

TABELA = """
IF OBJECT_ID('dbo.fleta') IS NOT NULL DROP TABLE dbo.fleta;
CREATE TABLE dbo.fleta (
    grupo     INT NOT NULL,
    elemento  INT NOT NULL,
    fase      INT NOT NULL,
    custo     INT NOT NULL,
    skill_id  BIGINT NULL,
    tipo      INT NULL,
    efeito    NVARCHAR(200) NULL,
    PRIMARY KEY (grupo, elemento, fase)
);
"""


def registros():
    for suf in ("_pt", "_en", ""):
        cam = os.path.join(BASE, "fletaAttr.lod" + suf)
        if os.path.exists(cam):
            break
    else:
        raise SystemExit("nao achei o fletaAttr.lod")
    d = lod_crypto.decrypt_lod_stream(open(cam, "rb").read())
    (n,) = struct.unpack_from("<I", d, 0)
    for i in range(n):
        r = d[4 + i * TAM: 4 + (i + 1) * TAM]
        if len(r) < TAM:
            break
        grupo, elem, fase, custo, skill, tipo = struct.unpack_from("<6I", r, 0)
        yield grupo, elem, fase, custo, skill, tipo


def main() -> int:
    con = pyodbc.connect(CONEXAO, autocommit=False)
    cur = con.cursor()
    for parte in TABELA.split(";"):
        if parte.strip():
            cur.execute(parte)

    linhas = []
    for grupo, elem, fase, custo, skill, tipo in registros():
        cur.execute("SELECT TOP 1 descricao FROM dbo.skill WHERE skill_id = ? AND nivel = ?",
                    skill, fase)
        l = cur.fetchone()
        efeito = (l[0] or "").replace("\r", " ").replace("\n", " / ").strip() if l else None
        linhas.append((grupo, elem, fase, custo, skill, tipo, efeito))

    cur.executemany("INSERT INTO dbo.fleta (grupo, elemento, fase, custo, skill_id, tipo, "
                    "efeito) VALUES (?,?,?,?,?,?,?)", linhas)
    con.commit()

    cur.execute("SELECT grupo, elemento, skill_id, MIN(custo), MAX(fase) FROM dbo.fleta "
                "GROUP BY grupo, elemento, skill_id ORDER BY grupo, elemento")
    print("dbo.fleta: %d linhas, %d elementos\n" % (len(linhas), cur.rowcount))
    print("%-6s %-9s %-10s %-6s %s" % ("grupo", "elemento", "skill", "fases", "efeito na fase 1"))
    print("-" * 88)
    for g, e, s, _, maxf in cur.fetchall():
        cur2 = con.cursor()
        cur2.execute("SELECT efeito FROM dbo.fleta WHERE grupo=? AND elemento=? AND fase=1", g, e)
        ef = cur2.fetchone()
        print("%-6d %-9d %-10d %-6d %s" % (g, e, s, maxf, (ef[0] if ef and ef[0] else "?")[:46]))
    print()
    cur.execute("SELECT DISTINCT fase, custo FROM dbo.fleta ORDER BY fase")
    print("custo por fase: " + ", ".join("f%d=%d" % (f, c) for f, c in cur.fetchall()))
    con.close()
    return 0


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