RecurlyWrapper = require("./RecurlyWrapper")
Settings = require "settings-sharelatex"
User = require('../../models/User').User
logger = require('logger-sharelatex')
SubscriptionUpdater = require("./SubscriptionUpdater")
LimitationsManager = require('./LimitationsManager')
EmailHandler = require("../Email/EmailHandler")

module.exports =

	createSubscription: (user, recurlySubscriptionId, callback)->
		self = @
		RecurlyWrapper.getSubscription recurlySubscriptionId, {recurlyJsResult: true}, (error, recurlySubscription) ->
			return callback(error) if error?
			SubscriptionUpdater.syncSubscription recurlySubscription, user._id, (error) ->
				return callback(error) if error?
				callback()

	updateSubscription: (user, plan_code, callback)->
		logger.log user:user, plan_code:plan_code, "updating subscription"
		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
			if hasSubscription
				RecurlyWrapper.updateSubscription subscription.recurlySubscription_id, {plan_code: plan_code, timeframe: "now"}, (error, recurlySubscription) ->
					return callback(error) if error?
					SubscriptionUpdater.syncSubscription recurlySubscription, user._id, callback
			else
				callback()

	cancelSubscription: (user, callback) ->
		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
			if hasSubscription
				RecurlyWrapper.cancelSubscription subscription.recurlySubscription_id, (error) ->
					return callback(error) if error?
					emailOpts =
						to: user.email
						first_name: user.first_name
					EmailHandler.sendEmail "canceledSubscription", emailOpts
					callback()
			else
				callback()

	reactivateSubscription: (user, callback) ->
		LimitationsManager.userHasSubscription user, (err, hasSubscription, subscription)->
			if hasSubscription
				RecurlyWrapper.reactivateSubscription subscription.recurlySubscription_id, (error) ->
					return callback(error) if error?
					callback()
			else
				callback()

	recurlyCallback: (recurlySubscription, callback) ->
		RecurlyWrapper.getSubscription recurlySubscription.uuid, includeAccount: true, (error, recurlySubscription) ->
			return callback(error) if error?
			User.findById recurlySubscription.account.account_code, (error, user) ->
				return callback(error) if error?
				SubscriptionUpdater.syncSubscription recurlySubscription, user._id, callback