/**
    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 Q = require('q'),
    fs = require('fs'),
    path = require('path'),
    shell = require('shelljs'),
    et = require('elementtree');

module.exports = function create( name, id, version, pluginPath, options ) {
    var cwd = pluginPath + "/" + name + "/",
        docDir = path.join(__dirname, '..', 'doc/'),
        baseJS,
        root,
        pluginName,
        clobber,
        jsMod,
        pluginxml;

    //check we are not already in a plugin
    if( fs.existsSync( cwd + 'plugin.xml' ) ) {
        return Q.reject( new Error( 'plugin.xml already exists. Are you already in a plugin?' ) );
    }

    //Create a plugin.xml file
    root = et.Element( 'plugin' );
    root.set( 'xmlns', 'http://apache.org/cordova/ns/plugins/1.0' );
    root.set( 'xmlns:android', 'http://schemas.android.com/apk/res/android' );
    root.set( 'id', id );
    root.set( 'version', version );

    //Add the name tag
    pluginName = et.XML( "<name>" );
    pluginName.text = name;
    root.append( pluginName );

    //loop through the options( variables ) for other tags
    for( var key in options ) {
        var temp = et.XML( "<" + key + ">");
        temp.text = options[ key ];
        root.append( temp );
    }

    //setup the directory structure
    shell.mkdir( '-p', cwd + "www" );
    shell.mkdir( '-p', cwd + "src" );

    //create a base plugin.js file
    baseJS = fs.readFileSync( docDir + 'base.js', 'utf-8').replace( /%pluginName%/g, name );
    fs.writeFileSync( cwd + 'www/' + name + '.js', baseJS, 'utf-8' );
    //Add it to the xml as a js module
    jsMod = et.Element( 'js-module' );
    jsMod.set( 'src', 'www/' + name + '.js' );
    jsMod.set( 'name', name );

    clobber = et.Element( 'clobbers' );
    clobber.set( 'target', 'cordova.plugins.' + name );
    jsMod.append( clobber );

    root.append( jsMod );

    //Write out the plugin.xml file
    fs.writeFileSync( cwd + "plugin.xml", new et.ElementTree( root ).write( {indent: 4} ), 'utf-8' );

    return Q();
};
