/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
*/

var fso = WScript.CreateObject('Scripting.FileSystemObject'),
    shell = WScript.CreateObject("shell.application"),
    wscript_shell = WScript.CreateObject("WScript.Shell");

//Set up directory structure of current release
//arguments passed in
var args = WScript.Arguments;

//Root folder of cordova-windowsphone (i.e C:\Cordova\cordova-windowsphone)
var repoRoot = WScript.ScriptFullName.split('\\wp8\\bin\\', 1);

//Sub folder containing templates
var templatePath = '\\template';

//Get version number
var versionNum ='0.0.0';

var platformRoot = WScript.ScriptFullName.split('\\bin\\', 1);

//  set with the -install switch, default false
var addToVS = false;

// help function
function Usage() {
    Log("\nUsage: createTemplates [-install]");
    Log("Build/zips up templates from the local repo")
    Log("    -install : also installs templates to user directory on success\n");
}

// logs messaged to stdout and stderr
function Log(msg, error) {
    if (error) {
        WScript.StdErr.WriteLine(msg);
    }
    else {
        WScript.StdOut.WriteLine(msg);
    }
}

// deletes file if it exists
function deleteFileIfExists(path) {
    if(fso.FileExists(path)) {
        fso.DeleteFile(path);
   }
}

function deleteFolderIfExists(path) {
    if(fso.FolderExists(path)) {
        fso.DeleteFolder(path);
    }
}

var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;

// returns the contents of a file
function read(filename) {
    if(fso.FileExists(filename))
    {
        var f=fso.OpenTextFile(filename, 1,2);
        var s=f.ReadAll();
        f.Close();
        return s;
    }
    else
    {
        Log('Cannot read non-existant file : ' + filename,true);
        WScript.Quit(1);
    }
    return null;
}

// writes the contents to the specified file
function write(filename, contents) {
    var f=fso.OpenTextFile(filename, ForWriting, TristateTrue);
    f.Write(contents);
    f.Close();
}

// replaces the matches of regexp with replacement
function replaceInFile(filename, regexp, replacement) {
    var text = read(filename).replace(regexp,replacement);
    write(filename,text);
}

// executes a commmand in the shell
function exec(command) {
    var oShell=wscript_shell.Exec(command);
    var maxTime = 5000;
    while (oShell.Status === 0) {
        if(maxTime > 0) {
            maxTime -= 100;
            WScript.sleep(100);
        }
        else {
            Log("Exec timed out with command :: " + command);
        }
    }
}

// executes a commmand in the shell
function exec_verbose(command) {
    //Log("Command: " + command);
    var oShell=wscript_shell.Exec(command);
    while (oShell.Status === 0) {
        //Wait a little bit so we're not super looping
        WScript.sleep(100);
        //Print any stdout output from the script
        if(!oShell.StdOut.AtEndOfStream) {
            Log(oShell.StdOut.ReadLine());
        }
    }
    //Check to make sure our scripts did not encounter an error
    if(!oShell.StdErr.AtEndOfStream)
    {
        var err_line = oShell.StdErr.ReadAll();
        WScript.StdErr.WriteLine(err_line);
        WScript.Quit(1);
    }
}

function copyFile(src,dest) {
    exec('%comspec% /c copy /Y ' + src + ' ' + dest);
}

function copyCommonScripts() {
    var srcPath = platformRoot + "\\bin";
    var destPath = platformRoot + templatePath + "\\cordova";
    
    copyFile(srcPath + "\\check_reqs.bat", destPath + "\\check_reqs.bat");
    copyFile(srcPath + "\\check_reqs.js", destPath + "\\check_reqs.js");
}

function removeCommonScripts() {
    var destPath = platformRoot + templatePath + "\\cordova";

    deleteFileIfExists(destPath + "\\check_reqs.bat");
    deleteFileIfExists(destPath + "\\check_reqs.js");
}

// packages templates into .zip
function package_templates()
{
    Log("Creating template .zip files for wp8");
    var templateOutFilename = repoRoot + '\\CordovaWP8_' + versionNum.replace(/\./g, '_') + '.zip';

    // clear the destination
    deleteFileIfExists(templateOutFilename);

    // clean the template folder, if the project was opened in VS, it creates some useless cruft.
    deleteFolderIfExists(platformRoot + templatePath + '\\Bin');
    deleteFolderIfExists(platformRoot + templatePath + '\\obj');
    deleteFolderIfExists(platformRoot + templatePath + '\\Service\ References');

    deleteFileIfExists(platformRoot + templatePath + "\\CordovaWP8Solution.v11.suo");

    copyCommonScripts();

    copyFile(repoRoot + '\\VERSION',platformRoot + templatePath);

    copyFile(repoRoot + '\\wp8\\template\\cordova\\defaults.xml',platformRoot + templatePath + '\\config.xml');

    // update .vstemplate files for the template zips.

    var cleanVersionName = "CordovaWP8_" + versionNum.replace(/\./g, '_');

    var projXml = WScript.CreateObject("Microsoft.XMLDOM");
    projXml.async = false;
    var fullTemplatePath = platformRoot + templatePath + '\\MyTemplate.vstemplate';
    if (projXml.load(fullTemplatePath)) {

        // <Name>CordovaWP8_ + versionNum.replace(/\./g, '_')</Name>
        var xNode = projXml.selectSingleNode("VSTemplate/TemplateData/Name");
        if(xNode != null)
        {
            // Log("replacing version in Name");
            xNode.text = cleanVersionName;
        }

        // <DefaultName>CordovaWP8_ + versionNum</DefaultName>
        xNode = projXml.selectSingleNode("VSTemplate/TemplateData/DefaultName");
        if(xNode != null)
        {
            // Log("replacing version in DefaultName");
            xNode.text = cleanVersionName  + '_';
        }

        xNode = projXml.selectSingleNode("VSTemplate/TemplateData/Description");
        if(xNode != null)
        {
           xNode.text = xNode.text.replace("0.0.0", versionNum);
        }
        projXml.save(fullTemplatePath);

    }


    // Use proper XML-DOM named nodes and replace them with cordova current version
    var projXml = WScript.CreateObject("Microsoft.XMLDOM");
    projXml.async = false;
    if (projXml.load(platformRoot + templatePath + '\\MyTemplate.vstemplate')) {

        // <Name>CordovaWP7_ + versionNum.replace(/\./g, '_')</Name>
        var xNode = projXml.selectSingleNode("VSTemplate/TemplateData/Name");
        if(xNode != null)
        {
           xNode.text = "CordovaWP8_" + versionNum.replace(/\./g, '_');
        }

        // <DefaultName>CordovaWP7_ + versionNum</DefaultName>
        xNode = projXml.selectSingleNode("VSTemplate/TemplateData/DefaultName");
        if(xNode != null)
        {
           xNode.text = "CordovaWP8_" + versionNum;
        }

        projXml.save(platformRoot + templatePath + '\\MyTemplate.vstemplate');
    }

    zip_project(templateOutFilename, platformRoot + templatePath);


    if(addToVS)
    {
        var template_dir = wscript_shell.ExpandEnvironmentStrings("%USERPROFILE%") + '\\Documents\\Visual Studio 2012\\Templates\\ProjectTemplates';
        if(fso.FolderExists(template_dir ))
        {
            dest = shell.NameSpace(template_dir);
            dest.CopyHere(templateOutFilename, 4|20);
        }
        else
        {
            Log("WARNING: Could not find template directory in Visual Studio,\n you can manually copy over the template .zip files.");
        }
        // add to VS-2013 as well
        template_dir = wscript_shell.ExpandEnvironmentStrings("%USERPROFILE%") + '\\Documents\\Visual Studio 2013\\Templates\\ProjectTemplates';
        if(fso.FolderExists(template_dir ))
        {
            dest = shell.NameSpace(template_dir);
            dest.CopyHere(templateOutFilename, 4|20);
        }
    }

    removeCommonScripts();
    deleteFileIfExists(platformRoot + templatePath + '\\config.xml');
    deleteFileIfExists(platformRoot + templatePath + "\\VERSION");
}

function zip_project(zip_path, project_path) {
    // create empty ZIP file and open for adding
    var file = fso.CreateTextFile(zip_path, true);

    // create twenty-two byte "fingerprint" for .zip
    file.write("PK");
    file.write(String.fromCharCode(5));
    file.write(String.fromCharCode(6));
    file.write('\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0');
    file.Close();

    // open .zip folder and copy contents of project_path to zip_path
    var zipFolder = shell.NameSpace(zip_path);

    var sourceItems = shell.NameSpace(project_path).items();
    if (zipFolder !== null) {
        zipFolder.CopyHere(sourceItems, 4|16|512|1024);
        var maxTime = 5000;
        //Log("sourceItems.Count = " + sourceItems.Count);
        while(zipFolder.items().Count < sourceItems.Count)
        {
            maxTime -= 100;
            if(maxTime > 0 ) {
                WScript.Sleep(100);
            }
            else {
                Log('Timeout. Failed to create .zip file.', true);
                break;
            }
        }
        //Log("zipFolder.items().Count = " + zipFolder.items().Count);
    }
    else {
        Log('Failed to create .zip file.', true);
    }
}

function parseArgs() {
    if(args.Count() > 0) {

        //Support help flags -help, --help, /?
        if(args(0).indexOf("-help") > -1 ||
           args(0).indexOf("/?") > -1 ) {
            Usage();
            WScript.Quit(1);
        }
        else if(args(0).indexOf("-install") > -1) {
            addToVS = true;
        }
    }
}

// MAIN
parseArgs();
// build/package the templates
versionNum = read(repoRoot + "\\VERSION");
package_templates(repoRoot);
