request = require 'request'
settings = require 'settings-sharelatex'

# TODO: check what happens when these settings aren't defined
DEFAULT_V1_PARAMS = {
	baseUrl: settings?.apis?.v1?.url
	auth:
		user: settings?.apis?.v1?.user
		pass: settings?.apis?.v1?.pass
	json: true,
	timeout: 30 * 1000
}

v1Request = request.defaults(DEFAULT_V1_PARAMS)

DEFAULT_V1_OAUTH_PARAMS = {
	baseUrl: settings?.apis?.v1?.url
	json: true,
	timeout: 30 * 1000
}

v1OauthRequest = request.defaults(DEFAULT_V1_OAUTH_PARAMS)

module.exports = V1Api =
	request: (options, callback) ->
		return request(options) if !callback?
		v1Request options, (error, response, body) ->
			V1Api._responseHandler options, error, response, body, callback

	oauthRequest: (options, token, callback) ->
		return callback(new Error "uri required") unless options.uri?
		options.method = "GET" unless options.method?
		options.auth = bearer: token
		v1OauthRequest options, (error, response, body) ->
			V1Api._responseHandler options, error, response, body, callback

	_responseHandler: (options, error, response, body, callback) ->
			return callback(error, response, body) if error?
			if 200 <= response.statusCode < 300 or response.statusCode in (options.expectedStatusCodes or [])
				callback null, response, body
			else
				error = new Error("overleaf v1 returned non-success code: #{response.statusCode} #{options.method} #{options.uri}")
				error.statusCode = response.statusCode
				callback error