import path from "path"
import {exec} from "child_process";
import fs from "fs";
import {logger} from "./logger";

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

export class BuildMetadata {

    private schema: any

    private code: string

    constructor(schema: any) {
        this.schema = schema
        this.code = ""
    }

    async build() {
        logger.info("movement build metadata");
        const hex = Buffer.from(JSON.stringify(this.schema)).toString("hex");
        return new Promise((resolve, reject) => {
            exec(`${cmd} bcs ${hex}`, (err, res) => {
                if (err) {
                    logger.error("movement build metadata failed");
                    reject(new Error("build metadata failed, please check this schema"))
                }
                this.code = res
                logger.success("movement build metadata success");
                resolve(this.code)
            });
        })
    }

    save(p: string) {
        fs.writeFileSync(p, Buffer.from(this.code, "hex"));
        logger.success(`movement save metadata to ${p} successfully`);
    }

    static getSchemaTemplate() {
        return {
            name: "packageName",
            upgrade_policy: {
                policy: 1,
            },
            upgrade_number: 0,
            source_digest: "0000000000000000000000000000000000000000000000000000000000000000",
            manifest: [],
            modules: [
                {
                    name: "moduleName",
                    source: [],
                    source_map: [],
                    extension: {
                        value: [],
                    },
                },
            ],
            deps: [
                {
                    account: "0000000000000000000000000000000000000000000000000000000000000001",
                    package_name: "AptosFramework",
                },
                {
                    account: "0000000000000000000000000000000000000000000000000000000000000001",
                    package_name: "AptosStdlib",
                },
                {
                    account: "0000000000000000000000000000000000000000000000000000000000000001",
                    package_name: "MoveStdlib",
                },
            ],
            extension: {
                value: [],
            },
        };
    }
}
