/*
       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");

var args = WScript.Arguments,
    //Root folder of cordova-wp7 (i.e C:\Cordova\cordova-wp7)
    ROOT = WScript.ScriptFullName.split('\\tooling\\', 1),
    //Sub folder containing templates
    TEMPLATES_PATH = '\\templates',
    //Sub folder for standalone project
    STANDALONE_PATH = TEMPLATES_PATH + '\\standalone',
    //Sub folder for full project
    FULL_PATH = TEMPLATES_PATH + '\\full',
    //Sub folder containing framework
    FRAMEWORK_PATH = '\\framework',
    //Subfolder containing example project
    EXAMPLE_PATH = '\\example',
    CORDOVA_WP7 = 'https://git-wip-us.apache.org/repos/asf/cordova-wp7.git';


//Destination to build to
var BUILD_DESTINATION;
// pull the project down from github?
var GET_NEW = false;

// help function
function Usage()
{
    WScript.StdOut.WriteLine("");
    WScript.StdOut.WriteLine("Usage: new [ PathToDestinationFolder ]");
    WScript.StdOut.WriteLine("    PathToDestinationFolder : Folder you wish to be created for a new cordova-wp7 repo");
    WScript.StdOut.WriteLine("examples:");
    WScript.StdOut.WriteLine("    new C:\\Users\\anonymous\\Desktop\\cordova-wp7");
    WScript.StdOut.WriteLine("");
}

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

// executes a commmand in the shell
function exec(command) {
    var oShell=wscript_shell.Exec(command);
    while (oShell.Status == 0) {
        WScript.sleep(100);
    }
}

function copy_to(path)
{
    //Copy everything over to BUILD_DESTINATION
    var dest = shell.NameSpace(path);
    WScript.StdOut.WriteLine("Copying files to build directory...");

    /** copy by file instead? (just what we need)**/
    dest.CopyHere(ROOT + "\\bin", 4|20);
    dest.CopyHere(ROOT + EXAMPLE_PATH, 4|20);      //Should mostly be copied from standalone
    dest.CopyHere(ROOT + FRAMEWORK_PATH, 4|20);
    dest.CopyHere(ROOT + TEMPLATES_PATH, 4|20);
    dest.CopyHere(ROOT + "\\tests", 4|20);
    dest.CopyHere(ROOT + "\\tooling", 4|20);
    dest.CopyHere(ROOT + "\\.gitignore", 4|20);
    dest.CopyHere(ROOT + "\\LICENSE", 4|20);
    dest.CopyHere(ROOT + "\\NOTICE", 4|20);
    dest.CopyHere(ROOT + "\\README.md", 4|20);
    dest.CopyHere(ROOT + "\\VERSION", 4|20);
}

WScript.StdOut.WriteLine("");

if(args.Count() > 0)
{
    if(fso.FolderExists(args(0)))
    {
        WScript.StdErr.WriteLine("The given directory already exists!");
        Usage();
        WScript.Quit(1);
    }
    else
    {
        BUILD_DESTINATION = args(0);

    }

    if(!GET_NEW) {

        if(fso.FolderExists(BUILD_DESTINATION))
        {
            WScript.StdErr.WriteLine("The given directory already exists!");
            Usage();
            WScript.Quit(1);
        }
        else
        {
            BUILD_DESTINATION = args(0);
        }

        // set up file structure
        fso.CreateFolder(BUILD_DESTINATION);
        // copy nessisary files
        copy_to(BUILD_DESTINATION);
    }
    else
    {
        wscript_shell.CurrentDirectory = arg(0) + '\\..';
        BUILD_DESTINATION = wscript_shell.CurrentDirectory + '\\cordova-wp7';

        WScript.StdOut.WriteLine('Cloning cordova-wp7 from git, build destination now ' + BUILD_DESTINATION);
        if(fso.FolderExists(BUILD_DESTINATION))
        {
            WScript.StdErr.WriteLine("Could not clone cordova-wp7 from git because it's directory already exists!");
            WScript.Quit(1);
        }

        exec('git clone ' + CORDOVA_WP7); //git fetch --tags && git checkout?

    }
}
else
{
    Usage();
    WScript.Quit(1);
}