/*
 *
 * 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 fs       = require('fs');
var path     = require('path');

var express  = require('express');

var collect  = require('./collect');

var testLibName    = path.join(__dirname, '..', '..', 'pkg', 'cordova.test.js');
var testLib        = fs.readFileSync(testLibName, 'utf8');

var pathToTemplate = path.join(__dirname, '..', 'templates', 'suite.html');
var pathToVendor   = path.join(__dirname, '..', 'vendor');
var pathToJasmine  = path.join(__dirname, '..', '..', 'node_modules', 'jasmine-node', 'lib', 'jasmine-node');
var pathToTests    = path.join(__dirname, '..', '..', 'test');

var template = fs.readFileSync(pathToTemplate, "utf-8");

// middlewar for GET '/cordova.test.js'
function cordovajs(req, res) {
    res.writeHead(200, {
        "Cache-Control": "no-cache",
        "Content-Type": "text/javascript"
    });
    res.end(testLib);
}

// middleware for GET '/'
function root(req, res) {
    res.writeHead(200, {
        "Cache-Control": "no-cache",
        "Content-Type": "text/html"
    });

    //FIXME in place collect thing is atrocious
    //create the script tags to include
    var tests = [];
    collect(path.join(__dirname, '..', '..', 'test'), tests);
    var specs = tests.map(function (file, path) {
        return '<script src="' + file.replace(/\\/g, '/').replace(/^.*\/test\//, "/") +
            '" type="text/javascript" charset="utf-8"></script>';
    }).join('\n');

    template = template.replace(/<!-- ##TESTS## -->/g, specs);

    // write the document
    res.end(template);
}

// connect router defn
function routes(app) {
    app.get('/cordova.test.js', cordovajs);
    app.get('/', root);
}

module.exports = function() {
    console.log('starting browser-based tests');

    var app = express();

    app.set('port', 3000);

    app.use(express.static(pathToVendor));
    app.use(express.static(pathToJasmine));
    app.use(express.static(pathToTests));

    routes(app);

    app.listen(3000, () => console.log('Test Server running on: http://localhost:3000'));
};

