var Base = require('../../web/Processor');

/**
 * @class NGNX.web.WebRequestHelper
 * A request processor that creates several additional attributes on a request object. This is designed for making
 * it easier to process routes.
 * 
 * Provides the following additions to the request scope:
 * 
 * * **form**: An form or pre-parsed JSON body found in a `POST`, `PUT`, or `DELETE` request.
 * * **qs**: Query string parameters passed in the URL.
 * * **cgi**: On object containing `path_info`, `user_agent`, `method`, & `http_accept`.
 * * **browser**: On object containing `name`, `version`, `family`, `major`, `minor`, `patch`, & `mobile`.
 * 
 * _Example route.js_
 * 
 * `POST http://localhost/:userid/token?resend=true`
 * 
 * `{"address":"jdoe@doe.com"}`
 * 
 * 		'/:user': {
 * 			post: function(req,res){
 * 				var usr = getUser(req.route.params.userid);
 * 				if (usr.email !== req.form.address)
 * 					throw Error();
 * 				else if (req.url.resend !== undefined){
 * 					if (req.url.resend)
 * 						usr.resendEmail();
 * 				}
 * 			}
 * 		}
 * 
 * This should be implemented as a NGN.web.Server#processor.
 * 
 * **Example**
 * 		var web = new NGN.web.Server({
 * 			port: 8181,
 * 			processor: new NGNX.web.WebRequestHelper()
 * 		});
 * @extends NGN.web.Processor
 */

var Class = Base.extend({
	
	/**
	 * @constructor
	 * Create a new RequestAid middleware method.
	 * @returns {Function}
	 */
	constructor: function(){
		
		Class.super.constructor.call(this,{
			fn: function(req,res,next){
				var ua = (req.headers['user-agent'] || '').toLowerCase();
				var uaParser = require('ua-parser');
				var b = uaParser.parse(ua);		
				
				req.form = 	req.method.trim().toUpperCase() == 'PUT' 
							|| req.method.trim().toUpperCase() == 'POST'
							|| req.method.trim().toUpperCase() == 'DELETE'
							? (typeof req.body === 'string' ? JSON.parse(req.body) : req.body)
							: {};
				req.qs		= req.query || {};
				req.cgi		= {
								path_info: req.url,
								user_agent: ua,
								method: req.originalMethod || __req.method,
								'http_accept': req.headers.accept !== undefined ? req.headers.accept.split(',') : []
							};
				req.browser	= {
								name: b.toString(),
								version: b.toVersionString(),
								family:	b.family,
								major: b.major || null,
								minor: b.minor || null,
								patch: b.patch || null,
								mobile: __NGN.pattern.isMobileDevice(ua)	
							};

				// Specific to web server
				if (res.locals) {
					res.locals({
						url: 		req.url,
						browser: 	req.browser
					});

					if (__NGN.app !== undefined)
						res.locals.application = __NGN.app.toJson();

					if (req.form !== {})
						res.locals.form = req.form;
				}

				next();
			}
		});
		
	}
	
});

module.exports = Class;