declare var require: any, process: any;
var fs: any = require('fs');
var path: any = require('path');

function instrumentForRecording(fn: string, tscPath: string) {
    instrument(tscPath, `
ts.sys = Playback.wrapSystem(ts.sys);
ts.sys.startRecord("${ fn }");`, `ts.sys.endRecord();`);
}

function instrumentForReplay(logFilename: string, tscPath: string) {
    instrument(tscPath, `
ts.sys = Playback.wrapSystem(ts.sys);
ts.sys.startReplay("${ logFilename }");`);
}

function instrument(tscPath: string, prepareCode: string, cleanupCode: string = '') {
    var bak = tscPath + '.bak';
    fs.exists(bak, (backupExists: boolean) => {
        var filename = tscPath;
        if (backupExists) {
            filename = bak;
        }

        fs.readFile(filename, 'utf-8', (err: any, tscContent: string) => {
            if (err) throw err;

            fs.writeFile(bak, tscContent, (err: any) => {
                if (err) throw err;

                fs.readFile(path.resolve(path.dirname(tscPath) + '/loggedIO.js'), 'utf-8', (err: any, loggerContent: string) => {
                    if (err) throw err;

                    var invocationLine = 'ts.executeCommandLine(ts.sys.args);';
                    var index1 = tscContent.indexOf(invocationLine);
                    if (index1 < 0) {
                        throw new Error("Could not find " + invocationLine);
                    }

                    var index2 = index1 + invocationLine.length;
                    var newContent = tscContent.substr(0, index1) + loggerContent + prepareCode + invocationLine + cleanupCode + tscContent.substr(index2) + '\r\n';
                    fs.writeFile(tscPath, newContent);
                });
            });
        });
    });
}

var isJson = (arg: string) => arg.indexOf(".json") > 0;

var record = process.argv.indexOf('record');
var tscPath = process.argv[process.argv.length - 1];
if (record >= 0) {
    console.log('Instrumenting ' + tscPath + ' for recording');
    instrumentForRecording(process.argv[record + 1], tscPath);
} else if (process.argv.some(isJson)) {
    var filename = process.argv.filter(isJson)[0];
    instrumentForReplay(filename, tscPath);
}


