"use strict";
exports.__esModule = true;
var fs_1 = require("fs");
var path = require("path");
function convertFile(file) {
    var extension = path.extname(file);
    var withoutExtension = file.substr(0, file.length - extension.length);
    var targetFile = withoutExtension + ".ts";
    var baseName = path.basename(file, extension);
    var content = fs_1.readFileSync(file, 'utf8');
    var result = convert(content, baseName);
    console.log("Writing to \"" + targetFile + "\"...");
    fs_1.writeFileSync(targetFile, result);
}
exports.convertFile = convertFile;
function convert(input, name) {
    var result = convertImports(input, name);
    return result;
}
exports.convert = convert;
function convertImports(input, name) {
    var items = [];
    var result = input.replace(/<!-- #include file="(.*?\/)?(.*?).asp" -->/gi, function (input, group1, group2) {
        var path = group1 || './';
        var file = "" + path + group2;
        items.push({ name: group2, path: file });
        return "<%\n" + group2 + "();\n%>";
    });
    result = convertCode(result);
    result = convertExpressions(result);
    result = convertStrings(result);
    result = "\nexport function " + name + "() {\n" + result + "\n}";
    for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
        var item = items_1[_i];
        result = "import {" + item.name + "} from \"" + item.path + "\"\n" + result;
    }
    return result;
}
exports.convertImports = convertImports;
function convertCode(input) {
    var result = input.replace(/<%([^=][\s\S]*?)%>/gi, function (input, group1) {
        var code = group1;
        code = convertComments(code);
        code = convertIfStatements(code);
        code = convertSwitchStatements(code);
        code = convertFunctions(code);
        code = convertForStatements(code);
        code = convertLoops(code);
        code = convertPRec(code);
        code = convertPLan(code);
        return "<%" + code + "%>";
    });
    return result;
}
exports.convertCode = convertCode;
function convertExpressions(input) {
    var result = input.replace(/<%=([\s\S]*?)%>/gi, function (input, group1) {
        var content = convertPRec(group1);
        content = convertPLan(content);
        return "${" + content + "}";
    });
    return result;
}
exports.convertExpressions = convertExpressions;
function convertStrings(input) {
    var result = input.replace(/%>([\s\S]+?)<%/gi, "\nResponse.Write(`$1`);\n");
    // Entire document is a string
    if (result.indexOf("<%") === -1) {
        result = "Response.Write(`" + result + "`);";
    }
    // Start of the document is a string
    var firstIndex = result.indexOf("<%");
    if (firstIndex > 0) {
        result = "Response.Write(`" + result.substr(0, firstIndex) + "`);\n" + result.substring(firstIndex + 2);
    }
    result = result.replace(/%>$/, "");
    // End of the document is a string
    var lastIndex = result.lastIndexOf("%>");
    if (lastIndex > -1 && lastIndex < result.length - 2) {
        result = result.substr(0, lastIndex) + "\nResponse.Write(`" + result.substr(lastIndex + 3) + "`);";
    }
    result = result.replace(/^<%/, "");
    return result;
}
exports.convertStrings = convertStrings;
function convertComments(input) {
    var result = '';
    var splitted = input.split(/(".*")/gim);
    for (var _i = 0, splitted_1 = splitted; _i < splitted_1.length; _i++) {
        var part = splitted_1[_i];
        if (part.indexOf("\"") === 0) {
            result += part;
        }
        else {
            result += part.replace(/'/gi, "//");
        }
    }
    return result;
}
exports.convertComments = convertComments;
function convertIfStatements(input) {
    var result = input.replace(/if +(.*?) +then/gi, function (input, group1) {
        var condition = convertConditions(group1);
        return "\nif (" + condition + ") {\n";
    });
    result = result.replace(/end if/gi, "\n}\n");
    result = result.replace(/else(?!{)/gi, "\n}\nelse {\n");
    return result;
}
exports.convertIfStatements = convertIfStatements;
function convertSwitchStatements(input) {
    var result = input.replace(/select case +(.*)/gi, "\nswitch ($1) {\n");
    result = result.replace(/end select/gi, "\n}\n");
    return result;
}
exports.convertSwitchStatements = convertSwitchStatements;
function convertFunctions(input) {
    var result = input.replace(/function +(.*)\((.*)\)/gi, "\n$1 = ($2) => {\n");
    result = result.replace(/end function/gi, "\n}\n");
    return result;
}
exports.convertFunctions = convertFunctions;
function convertForStatements(input) {
    var result = input.replace(/for +(.*to.*)/gi, "\nfor ($1) {\n");
    result = result.replace(/^ *next *$/gim, "}\n");
    return result;
}
exports.convertForStatements = convertForStatements;
function convertConditions(input) {
    var result = input.replace(/ +and +/gi, " && ");
    result = result.replace(/ +or +/gi, " || ");
    result = result.replace(/ +<> +/gi, " !== ");
    result = result.replace(/ += +/gi, " === ");
    return result;
}
exports.convertConditions = convertConditions;
function convertLoops(input) {
    var result = input.replace(/do while +(.*)/gi, function (input, group1) {
        var condition = convertConditions(group1);
        return "\nwhile (" + condition + ") {\n";
    });
    
    result = result.replace(/^ *loop *$/gim, "}\n");
    return result;
}
exports.convertLoops = convertLoops;
function convertPRec(input) {
    var result = input.replace(/(p_rec\("\S+?"\))/gi, "$1.Value");
    return result;
}
exports.convertPRec = convertPRec;
function convertPLan(input) {
    var result = input.replace(/(l_\S+?)\(p_lan\)/gi, "$1[p_lan]");
    return result;
}
exports.convertPLan = convertPLan;