ObjectId = require("mongojs").ObjectId
request = require("request")
async = require("async")
settings = require("settings-sharelatex")
port = settings.internal.trackchanges.port
logger = require "logger-sharelatex"
LockManager = require "./LockManager"

module.exports =
	check : (callback)->
		project_id = ObjectId(settings.trackchanges.healthCheck.project_id)
		url = "http://localhost:#{port}/project/#{project_id}"
		logger.log project_id:project_id, "running health check"
		jobs = [
			(cb)->
				request.get {url:"http://localhost:#{port}/check_lock", timeout:3000}, (err, res, body) ->
					if err?
						logger.err err:err, project_id:project_id, "error checking lock for health check"
						cb(err)
					else if res?.statusCode != 200
						cb("status code not 200, it's #{res.statusCode}")
					else
						cb()
			(cb)->
				request.post {url:"#{url}/flush", timeout:10000}, (err, res, body) ->
					if err?
						logger.err err:err, project_id:project_id, "error flushing for health check"
						cb(err)
					else if res?.statusCode != 204
						cb("status code not 204, it's #{res.statusCode}")
					else
						cb()
			(cb)->
				request.get {url:"#{url}/updates", timeout:10000}, (err, res, body)->
					if err?
						logger.err err:err, project_id:project_id, "error getting updates for health check"
						cb(err)
					else if res?.statusCode != 200
						cb("status code not 200, it's #{res.statusCode}")
					else
						cb()
		]
		async.series jobs, callback

	checkLock: (callback) ->
		LockManager.healthCheck callback