Promise = require 'bluebird'
express = require 'express'
compress = require 'compression'
bodyParser = require 'body-parser'
uaParser = require 'ua-parser-js'
extend = require 'extend'
fs = Promise.promisifyAll require 'fs-extra'
app = express()
port = 13947

DB = new ()->
	@results = {}
	fs.ensureFileAsync('results.json').then ()=>
		fs.readFileAsync('results.json', 'encoding':'utf8').then (results)=>
			@results = JSON.parse(results) if results

	@save = ()-> fs.writeFileAsync('results.json', JSON.stringify(@results))
	
	@add = ({library, version, testName, testDesc, result, UA, nonSharedTest})->
		UA = getUA(UA)
		@results ?= {}
		@results[testName] ?= 'name':testName,'desc':testDesc, 'values':{}
		@results[testName].nonSharedTest = nonSharedTest or false
		@results[testName].values[UA] ?= {}
		@results[testName].values[UA][library] ?= {}
		@results[testName].values[UA][library][version] = result
		@save()

	return @


getUA = (uaString = '')->
	UA = uaParser(uaString).browser
	UA = "#{UA.name} #{UA.major or UA.version}"



## ==========================================================================
## Middleware
## ========================================================================== 
app.use compress()
app.use express.static('dist', maxAge: 2592000000)
app.use bodyParser.json({limit:'500mb'}) # Enable JSON req parsing
app.use bodyParser.urlencoded({extended:true, limit:'500mb'})




## ==========================================================================
## Router
## ========================================================================== 
app.get '/', (req, res)->
	res.sendFile "#{__dirname}/dist/index.html"


app.get '/get', (req, res)->
	UA = getUA(req.query.UA)
	responseResult = {'selfUA':UA, 'tests':DB.results or {}}
	output = extend(true, {}, responseResult)
	res.json(output)


app.post '/set', (req, res)->
	req.body.nonSharedTest = if req.body.nonSharedTest is 'false' then false else if req.body.nonSharedTest then true
	res.json(req.body)
	DB.add(req.body)








## ==========================================================================
## Server init
## ========================================================================== 
app.listen port, ()->
	console.log("Server running on http://localhost:#{port}")
.on 'error', console.log.bind(console)





