AuthenticationController = require('../Authentication/AuthenticationController')
UserGetter = require("./UserGetter")
UserUpdater = require("./UserUpdater")
EmailHelper = require("../Helpers/EmailHelper")
UserEmailsConfirmationHandler = require "./UserEmailsConfirmationHandler"
logger = require("logger-sharelatex")
Errors = require "../Errors/Errors"

module.exports = UserEmailsController =

	list: (req, res, next) ->
		userId = AuthenticationController.getLoggedInUserId(req)
		UserGetter.getUserFullEmails userId, (error, fullEmails) ->
			return next(error) if error?
			res.json fullEmails


	add: (req, res, next) ->
		userId = AuthenticationController.getLoggedInUserId(req)
		email = EmailHelper.parseEmail(req.body.email)
		return res.sendStatus 422 unless email?

		UserUpdater.addEmailAddress userId, email, (error)->
			return next(error) if error?
			UserEmailsConfirmationHandler.sendConfirmationEmail userId, email, (err) ->
				return next(error) if error?
				res.sendStatus 204


	remove: (req, res, next) ->
		userId = AuthenticationController.getLoggedInUserId(req)
		email = EmailHelper.parseEmail(req.body.email)
		return res.sendStatus 422 unless email?

		UserUpdater.removeEmailAddress userId, email, (error)->
			return next(error) if error?
			res.sendStatus 200


	setDefault: (req, res, next) ->
		userId = AuthenticationController.getLoggedInUserId(req)
		email = EmailHelper.parseEmail(req.body.email)
		return res.sendStatus 422 unless email?

		UserUpdater.setDefaultEmailAddress userId, email, (error)->
			return next(error) if error?
			res.sendStatus 200

	showConfirm: (req, res, next) ->
		res.render 'user/confirm_email', {
			token: req.query.token,
			title: 'confirm_email'
		}

	confirm: (req, res, next) ->
		token = req.body.token
		if !token?
			return res.sendStatus 422
		UserEmailsConfirmationHandler.confirmEmailFromToken token, (error) ->
			if error?
				if error instanceof Errors.NotFoundError
					res.status(404).json({
						message: 'Sorry, your confirmation token is invalid or has expired. Please request a new email confirmation link.'
					})
				else
					next(error)
			else
				res.sendStatus 200