// https://github.com/move-language/move/blob/main/language/documentation/spec/vm.md#signaturetokens
import fs from "fs";
import {logger} from "./logger";
import {exec} from "child_process";
import path from "path";

const SignatureTokens = {
    "01": "BOOL",
    "02": "U8",
    "03": "U64",
    "04": "U128",
    "05": "ADDRESS",
    "06": "REFERENCE",
    "07": "MUTABLE_REFERENCE",
    "08": "STRUCT",
    "09": "TYPE_PARAMETER",
    "0a": "VECTOR",
    "0b": "STRUCT_INST",
    "0c": "SIGNER",
    "0d": "U16",
    "0e": "U32",
    "0f": "U256"
}
// https://github.com/move-language/move/blob/main/language/documentation/spec/vm.md#bytecodes
// @typescript-eslint/no-unused-vars
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const ByteCodes = {
    "0x01": "POP",
    "0x02": "RET",
    "0x03": "BR_TRUE(offset)",
    "0x04": "BR_FALSE(offset)",
    "0x05": "BRANCH(offset)",
    "0x06": "LD_U64(value)",
    "0x07": "LD_CONST(index)",
    "0x08": "LD_TRUE",
    "0x09": "LD_FALSE",
    "0x0a": "COPY_LOC(index)",
    "0x0b": "MOVE_LOC(index)",
    "0x0c": "ST_LOC(index)",
    "0x0d": "MUT_BORROW_LOC(index)",
    "0x0e": "IMM_BORROW_LOC(index)",
    "0x0f": "MUT_BORROW_FIELD(index)",
    "0x10": "IMM_BORROW_FIELD(index)",
    "0x11": "CALL(index)",
    "0x12": "PACK(index)",
    "0x13": "UNPACK(index)",
    "0x14": "READ_REF",
    "0x15": "WRITE_REF",
    "0x16": "ADD",
    "0x17": "SUB",
    "0x18": "MUL",
    "0x19": "MOD",
    "0x1a": "DIV",
    "0x1b": "BIT_OR",
    "0x1c": "BIT_AND",
    "0x1d": "XOR",
    "0x1e": "OR",
    "0x1f": "AND",
    "0x20": "NOT",
    "0x21": "EQ",
    "0x22": "NEQ",
    "0x23": "LT",
    "0x24": "GT",
    "0x25": "LE",
    "0x26": "GE",
    "0x27": "ABORT",
    "0x28": "NOP",
    "0x29": "EXISTS(index)",
    "0x2a": "MUT_BORROW_GLOBAL(index)",
    "0x2b": "IMM_BORROW_GLOBAL(index)",
    "0x2c": "MOVE_FROM(index)",
    "0x2d": "MOVE_TO(index)",
    "0x2e": "FREEZE_REF",
    "0x2f": "SHL",
    "0x30": "SHR",
    "0x31": "LD_U8(value)",
    "0x32": "LD_U128(value)",
    "0x33": "CAST_U8",
    "0x34": "CAST_U64",
    "0x35": "CAST_U128",
    "0x36": "MUT_BORROW_FIELD_GENERIC(index)",
    "0x37": "IMM_BORROW_FIELD_GENERIC(index)",
    "0x38": "CALL_GENERIC(index)",
    "0x39": "PACK_GENERIC(index)",
    "0x3a": "UNPACK_GENERIC(index)",
    "0x3b": "EXISTS_GENERIC(index)",
    "0x3c": "MUT_BORROW_GLOBAL_GENERIC(index)",
    "0x3d": "IMM_BORROW_GLOBAL_GENERIC(index)",
    "0x3e": "MOVE_FROM_GENERIC(index)",
    "0x3f": "MOVE_TO_GENERIC(index)"
}


const cmd = path.resolve(__dirname, "../static", "bin", "metabcs");

export class ParseMV {

    private code: string;


    constructor(code_path: string) {
        this.code = fs.readFileSync(code_path).toString("hex");
    }

    async parse() {
        logger.info("movement parse move bytecodes start ");
        return new Promise((resolve, reject) => {
            exec(`${cmd} disassemble ${this.code}`, (err, res) => {
                if (err) {
                    logger.error("movement parse move bytecodes failed");
                    reject(new Error("arse move bytecodes failed"))
                }
                resolve(res)
            });
        })
    }
}
