#!/usr/bin/env node

/**
 * @fileoverview
 * Script to upload a source en.json file to a particular transifex project resource.
 * Expects that the project and resource have already been defined in Transifex, and that
 * the person running the script has the the TX_TOKEN environment variable set to an api
 * token that has developer access.
 */

const fs = require('fs');
const path = require('path');
const transifex = require('transifex');

const args = process.argv.slice(2);

const usage = `
Push English source strings to Transifex. Usage:
  node tx-push-src.js tx-project tx-resource english-json-file
      tx-project:        the project slug on transifex
      tx-resource:       the resource slug on transifex
      english-json-file: path to the en.json source
  NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See
  the Localization page on the GUI wiki for information about setting up Transifex.
`;

// Exit if missing arguments or TX_TOKEN
if (args.length < 3 || !process.env.TX_TOKEN) {
    process.stdout.write(usage);
    process.exit(1);
}

// Globals
const PROJECT = args[0];
const RESOURCE = args[1];
const TX = new transifex({
    project_slug: PROJECT,
    credential: 'api:' + process.env.TX_TOKEN
});

let en = fs.readFileSync(path.resolve(args[2]));
en = JSON.parse(en);

// get the correct resource file type based on transifex project/repo and resource
const getResourceType = (project, resource) => {
    if (project === 'scratch-website') {
        // all the resources are KEYVALUEJSON
        return 'KEYVALUEJSON';
    }
    if (project === 'scratch-legacy') {
        // all the resources are po files
        return 'PO';
    }
    if (project === 'scratch-editor') {
        if (resource === 'blocks') {
            return 'KEYVALUEJSON';
        }
        // everything else is CHROME I18N JSON
        return 'CHROME';
    }
    if (project === 'scratch-videos') {
        // all the resources are srt files
        return 'SRT';
    }
    if (project === 'scratch-android') {
        // all the resources are android xml files
        return 'ANDROID';
    }
    if (project === 'scratch-resources') {
        // all the resources are Chrome format json files
        return 'CHROME';
    }
    process.stdout.write(`Error - Unknown resource type for:\n`);
    process.stdout.write(`  Project: ${project}, resource: ${resource}\n`);
    process.exit(1);
};

// update Transifex with English source
TX.uploadSourceLanguageMethod(PROJECT, RESOURCE, {content: JSON.stringify(en)}, (err) => {
    if (err && err.response.statusCode !== 404) {
        process.stdout.write(`Transifex Error: ${err.message}\n`);
        process.stdout.write(
            `Transifex Error ${err.response.statusCode.toString()}: ${err.response.body}\n`);
        process.exitCode = 1;
        return;
    }
    // file not found - create it, but also give message
    if (err && err.response.statusCode === 404) {
        process.stdout.write(`Transifex Resource not found, creating: ${RESOURCE}\n`);
        const resourceData = {
            slug: RESOURCE,
            name: RESOURCE,
            priority: 0, // default to normal priority
            i18n_type: getResourceType(PROJECT, RESOURCE),
            content: JSON.stringify(en)
        };
        TX.resourceCreateMethod(PROJECT, resourceData, (err1) => {
            if (err1) {
                process.stdout.write(`Transifex Error: ${err1.message}\n`);
                process.stdout.write(
                    `Transifex Error ${err1.response.statusCode.toString()}: ${err1.response.body}\n`);
                process.exitCode = 1;
                return;
            }
        });
    }
    process.exitCode = 0;
});