#!/usr/bin/env node
const fs = require("fs");
const colors = require('colors');
const {Meta} = require("../dist");

let { argv } = require('yargs')
    .usage('Usage: $0 -m http://localhost:63380 -k ./privatekeys.asc -n publickeys -r ./publickeys.asc')
    .example(
        '$0 -m http://localhost:63380 -k ./privatekeys.asc -n publickeys -r ./publickeys.asc',
        'Updates the public keys blob to the meta server'
    )
    .option('m', {
        alias: 'metaurl',
        describe: 'The URL for the meta service',
        demandOption: 'The meta url is required',
        type: 'string',
        nargs: 1,
    })
    .option('k', {
        alias: 'privatekey',
        describe: 'The PGP private key blob file used to sign the changes to the meta service',
        demandOption: 'The private key file is required',
        type: 'string',
        nargs: 1,
    })
    .option('n', {
        alias: 'name',
        describe: 'The name of the resource to be set or updated to the meta service',
        demandOption: 'The name of the resource is required',
        type: 'string',
        nargs: 1,
    })
    .option('r', {
        alias: 'resource',
        describe: 'The resource file to be set or updated to the meta service',
        demandOption: 'The resource file is required',
        type: 'string',
        nargs: 1,
    })
    .option('t', {
        alias: 'type',
        describe: 'The type of resource to be set or updated to the meta service\n' +
            'Options: `user`, `phone` and `custom`\n' +
            'Defaults to `custom`',
        type: 'string',
        nargs: 1,
    })
    .epilog('Grassroots Economics (c) 2021')
    .wrap(null);

const metaUrl = argv.m;
const privateKeyFile = argv.k;
const resourceName = argv.n;
const resourceFile = argv.r;
let type = argv.t;
if (type === undefined) {
    type = 'custom'
}

const privateKey = readFile(privateKeyFile);
const resource = readFile(resourceFile);

(async () => {
    if (privateKey && resource) {
        const identifier = await Meta.getIdentifier(resourceName, type);
        console.log(colors.cyan(`Meta server storage identifier: ${identifier}`));
        const meta = new Meta(metaUrl, privateKey);
        meta.onload = async (status) => {
            const response = await meta.set(identifier, resource)
            console.log(colors.green(response));
        }
    }
})();

function readFile(filename) {
    if(!fs.existsSync(filename)) {
        console.log(colors.red(`File ${filename} not found`));
        return;
    }
    return fs.readFileSync(filename, {encoding: 'utf8', flag: 'r'});
}