var http = require('http'),
    util = require('util'),
    port = process.env.PORT || 5000;
    stringify = require('json-stringify-safe'),
    Busboy = require('busboy'),
    inspect = require('util').inspect;

var DIRECT_UPLOAD_LIMIT = 85; // bytes

// convert from UTF-8 to ISO-8859-1
var LATIN1_SYMBOLS = '¥§©ÆÖÑøøø¼';
var Iconv  = require('iconv').Iconv;
var iconv = new Iconv('UTF-8', 'ISO-8859-1');

function parseMultipartForm(req, res, finishCb) {
    var fields = {}, files = {};
    var errorOccured = false;

    var busboy = new Busboy({ headers: req.headers });
    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
        var currentFile = { size: 0 };
        file.on('data', function(data) {
            currentFile.name = filename;
            currentFile.size += data.length;
        });

        file.on('end', function() {
            files.file = currentFile;
        });
    });

    busboy.on('field', function(fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) {
        fields[fieldname] = val;
    });

    busboy.on('finish', function() {
        console.log(stringify({fields: fields, files: files}));

        // This is needed due to this bug: https://github.com/mscdex/busboy/issues/73
        if (!errorOccured) {
            finishCb(req, res, {fields: fields, files: files});
        }
    });

    busboy.on('error', function(err) {
        console.error('error: ' + err + ': ' + JSON.stringify(err));
        errorOccured = true;

        res.writeHead(400, {'Content-Type': 'text/plain'});
        res.end("Could not parse multipart form: " + err + "\n");
    });

    req.pipe(busboy);
}

function respondWithParsedForm(req, res, parseResultObj) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(stringify(parseResultObj));
    res.end("\n");
}

function respondWithParsedFormNonUTF(req, res, parseResultObj) {
    parseResultObj["latin1Symbols"] = LATIN1_SYMBOLS;
    var buffer = iconv.convert(stringify(parseResultObj));
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.write(buffer);
    res.end("\n");
}

http.createServer(function (req, res) {
    // Set CORS headers
    res.setHeader('Access-Control-Allow-Origin', '*');

    var basic_auth_username = "cordova_user";
    var basic_auth_password = "cordova_password";

    var header = req.headers['authorization']||'',        // get the header
        token = header.split(/\s+/).pop()||'',            // and the encoded auth token
        auth = new Buffer(token, 'base64').toString(),    // convert from base64
        parts = auth.split(/:/),                          // split on colon
        username = parts[0],
        password = parts[1];

    if (req.url === "/download_basic_auth") {
        if (username != basic_auth_username && password != basic_auth_password) {
            res.writeHead(401, {'Content-Type': 'text/plain'});
            res.end("401\n");
        } else {
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.write("User-Agent: *\n");
            res.end("Disallow: /\n");
        }
    } else if (req.url === "/robots.txt") {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write("User-Agent: *\n");
        res.end("Disallow: /\n");
    } else if (req.url === "/download_non_utf") {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write("User-Agent: *\n");

        res.write(iconv.convert(LATIN1_SYMBOLS));

        res.end("Disallow: /\n");
    } else if (req.url === "/") {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.end("Hello!\n");
    } else if (req.url == '/upload' && (req.method.toLowerCase() == 'post' || req.method.toLowerCase() == 'put')) {
        if(req.headers["content-type"].indexOf("multipart/form-data") === 0) {
            console.log("multipart/form upload");
            parseMultipartForm(req, res, respondWithParsedForm);
        } else {
            console.log("direct upload");
            var body = '';
            req.on('data', function(chunk) {
                body += chunk;
                if (body.length > DIRECT_UPLOAD_LIMIT) { 
                    req.connection.destroy();
                }
            });

            req.on('end', function() {
                console.log('All the data received is: ' + body);
                res.writeHead(200, "OK", {'content-type': 'text/plain'});
                res.write(body);
                res.end();
            });
        }
    } else if (req.url == '/upload_basic_auth' && req.method.toLowerCase() == 'post') {
        if (username != basic_auth_username && password != basic_auth_password) {
            res.writeHead(401, {'Content-Type': 'text/plain'});
            res.end("401\n");
        } else {
            parseMultipartForm(req, res, respondWithParsedForm);
        }
    } else if (req.url == '/upload_non_utf' && req.method.toLowerCase() == 'post') {
        parseMultipartForm(req, res, respondWithParsedFormNonUTF);
    } else if (req.url == '/upload_echo_headers' && req.method.toLowerCase() == 'post') {
        res.writeHead(200, {'Content-Type': 'application/json'});
        res.write(stringify(req.headers));
        res.end("\n");
    } else if (req.url.match(/\d{3}/)) {
        var matches = req.url.match(/\d{3}/);
        status = matches[0];
        res.writeHead(status, {'Content-Type': 'text/plain'});
        res.end("You requested a " + status + "\n");
    } else {
        res.writeHead(404, {'Content-Type': 'text/plain'});
        res.end("404\n");
    }

    console.log(req.connection.remoteAddress + " " + req.method + " " + req.url + " " + res.statusCode + " " + req.headers['user-agent']);

}).listen(port, '0.0.0.0');
console.log('Server running on ' + port);