/*
 *  Copyright 2012 Research In Motion Limited.
 *
 * Licensed 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 path = require("path"),
    wrench = require("wrench"),
    cmdline = require("./cmdline"),
    logger = require("./logger"),
    fileManager = require("./file-manager"),
    localize = require("./localize"),
    configParser = require("./config-parser"),
    packagerUtils = require("./packager-utils"),
    packagerValidator = require("./packager-validator"),
    barBuilder = require("./bar-builder"),
    session;

module.exports = {
    start: function (callback) {
        try {
            cmdline.parse(process.argv);
            session = require("./session").initialize(cmdline.commander);

            //prepare files for webworks archiving
            logger.log(localize.translate("PROGRESS_FILE_POPULATING_SOURCE"));
            fileManager.prepareOutputFiles(session);

            //parse config.xml
            logger.log(localize.translate("PROGRESS_SESSION_CONFIGXML"));
            configParser.parse(path.join(session.sourceDir, "config.xml"), session, function (configObj) {
                //validate session Object
                packagerValidator.validateSession(session, configObj);
                //validage configuration object
                packagerValidator.validateConfig(session, configObj);

                //generate user.js
                logger.log(localize.translate("PROGRESS_GEN_OUTPUT"));
                //Adding debuEnabled property to user.js. Framework will enable/disable WebInspector based on that variable.
                configObj.debugEnabled = session.debug;

                barBuilder.build(session, configObj, function (code) {
                    fileManager.cleanSource(session);

                    if (code === 0) {
                        logger.log(localize.translate("PROGRESS_COMPLETE"));
                    }

                    if (callback && typeof callback === "function") {
                        callback(code);
                    }
                });
            });
        } catch (e) {
            try {
                fileManager.cleanSource(session);
            } catch (ex) {
            } finally {
                logger.error(e);
                if (callback && typeof callback === "function") {
                    callback(e);
                }
            }

        }
    }
};
