/**
 Utilities is a node modules created to make tasks like
 including html files easier for me programming.
 */

//used for file io
const fs = require('fs');


module.exports=
{
    /**
     * A function similar to the include statement in PHP
     * This function writes a file to the output
     *
     * @param fileName the file to append to the result
     */
    include: function(fileName)
    {
        return new Promise(function(resolve, reject)
        {
            try
            {
                resolve(fs.readFileSync(fileName));
            }
            catch (e)
            {
                console.log("Could not find " + fileName);
                resolve("");
            }
        });
    },

    includeInObject: function(key, context, fileName)
    {
        return new Promise(function(resolve, reject)
        {
            module.exports.include(fileName).then(function(result)
            {
                context[key] = result;
                resolve();
            }).catch(function(error)
            {
                context[key] = "File Not Found";
                reject(error);
                console.log(error);
            })
        })
    },


    /**
     * Method which return the contents of a file as a string
     * @param fileName
     * @return {*}
     */
    getFileContents: function(fileName)
    {
        try
        {
            return fs.readFileSync(fileName);
        }
        catch (e)
        {
            console.log("Could not find " + fileName);
        }
        return '';
    },


    /**
     *
     * @param fileName
     * @returns {any}
     */
    getFileAsJSON: function(fileName)
    {
        return JSON.parse(fs.readFileSync(fileName, 'utf8'));
    },


    /**
     * Returns all the contents of a file as a single line
     * with no break lines.
     *
     * @param fileName
     * @return {*}
     */
    getFileLine: function(fileName)
    {
        try
        {
            return fs.readFileSync(fileName, "utf8").split('\n').join('');
        }
        catch (e)
        {
            console.log("Could not find " + fileName);
        }
        return '';
    },


    /**
     * Function which is responsible for returning all post data.
     *
     * @param request sent by user in initial server call
     * @return the post data
     */
    getPostData: function(req)
    {
        return new Promise(function(resolve, reject)
        {
            if(req.method == 'POST')
            {
                var body = '';

                req.on('data', function (data)
                {
                    body += data;

                    //Kills request, don't steal my RAM!!
                    //You can only download so much ram ;)
                    if (body.length > 1e6)
                    {
                        req.connection.destroy();
                        reject();
                    }
                });

                req.on('end', function ()
                {
                    resolve(body);
                });
            }
            else
            {
                resolve(0);
            }
        });
    },


    /**
     * Displays 404 error to user
     *
     * @param result
     * @returns {*}
     */
    print404: function()
    {
        return this.include("includes/html/404.html");
    }
};