_ = require('underscore')
settings = require("settings-sharelatex")
marked = require('marked')

PersonalEmailLayout = require("./Layouts/PersonalEmailLayout")
NotificationEmailLayout = require("./Layouts/NotificationEmailLayout")
BaseWithHeaderEmailLayout = require("./Layouts/" + settings.brandPrefix + "BaseWithHeaderEmailLayout")

SingleCTAEmailBody = require("./Bodies/" + settings.brandPrefix + "SingleCTAEmailBody")

CTAEmailTemplate = (content) ->
	content.greeting ?= () -> 'Hi,'
	content.secondaryMessage ?= () -> ""
	return {
		subject: (opts) -> content.subject(opts),
		layout: BaseWithHeaderEmailLayout,
		plainTextTemplate: (opts) -> """
#{content.greeting(opts)}

#{content.message(opts).trim()}

#{content.ctaText(opts)}: #{content.ctaURL(opts)}

#{content.secondaryMessage?(opts).trim() or ""}

Regards,
The #{settings.appName} Team - #{settings.siteUrl}
		"""
		compiledTemplate: (opts) ->
			SingleCTAEmailBody({
				title: content.title?(opts)
				greeting: content.greeting(opts)
				message: marked(content.message(opts).trim())
				secondaryMessage: marked(content.secondaryMessage(opts).trim())
				ctaText: content.ctaText(opts)
				ctaURL: content.ctaURL(opts)
				gmailGoToAction: content.gmailGoToAction?(opts)
			})
	}

templates = {}

templates.registered = CTAEmailTemplate({
	subject: () -> "Activate your #{settings.appName} Account"
	message: (opts) -> """
Congratulations, you've just had an account created for you on #{settings.appName} with the email address '#{opts.to}'.

Click here to set your password and log in:
"""
	secondaryMessage: () -> "If you have any questions or problems, please contact #{settings.adminEmail}"
	ctaText: () -> "Set password"
	ctaURL: (opts) -> opts.setNewPasswordUrl
})

templates.canceledSubscription = CTAEmailTemplate({
	subject: () -> "#{settings.appName} thoughts"
	message: () -> """
I'm sorry to see you cancelled your #{settings.appName} premium account. Would you mind giving us some feedback on what the site is lacking at the moment via this quick survey?
"""
	secondaryMessage: () -> "Thank you in advance!"
	ctaText: () -> "Leave Feedback"
	ctaURL: (opts) -> "https://sharelatex.typeform.com/to/f5lBiZ"
})

templates.passwordResetRequested = CTAEmailTemplate({
	subject: () -> "Password Reset - #{settings.appName}"
	title: () -> "Password Reset"
	message: () -> "We got a request to reset your #{settings.appName} password."
	secondaryMessage: () -> """
If you ignore this message, your password won't be changed.

If you didn't request a password reset, let us know.
"""
	ctaText: () -> "Reset password"
	ctaURL: (opts) -> opts.setNewPasswordUrl
})

templates.confirmEmail = CTAEmailTemplate({
	subject: () -> "Confirm Email - #{settings.appName}"
	title: () -> "Confirm Email"
	message: () -> "Please confirm your email on #{settings.appName}."
	ctaText: () -> "Confirm Email"
	ctaURL: (opts) -> opts.confirmEmailUrl
})

templates.projectInvite = CTAEmailTemplate({
	subject: (opts) -> "#{opts.project.name} - shared by #{opts.owner.email}"
	title: (opts) -> "#{ opts.project.name } - shared by #{ opts.owner.email }"
	message: (opts) -> "#{ opts.owner.email } wants to share '#{ opts.project.name }' with you."
	ctaText: () -> "View project"
	ctaURL: (opts) -> opts.inviteUrl
	gmailGoToAction: (opts) ->
		target: opts.inviteUrl
		name: "View project"
		description: "Join #{ opts.project.name } at #{ settings.appName }"
})

templates.verifyEmailToJoinTeam = CTAEmailTemplate({
	subject: (opts) -> "#{ opts.inviterName } has invited you to join a team on #{settings.appName}"
	title: (opts) -> "#{opts.inviterName} has invited you to join a team on #{settings.appName}"
	message: (opts) -> "Please click the button below to join the team and enjoy the benefits of an upgraded #{ settings.appName } account."
	ctaText: (opts) -> "Join now"
	ctaURL: (opts) -> opts.acceptInviteUrl
})

templates.testEmail = CTAEmailTemplate({
	subject: () -> "A Test Email from #{settings.appName}"
	title: () -> "A Test Email from #{settings.appName}"
	greeting: () -> "Hi,"
	message: () -> "This is a test Email from #{settings.appName}"
	ctaText: () -> "Open #{settings.appName}"
	ctaURL: () -> settings.siteUrl
})

module.exports =
	templates: templates
	CTAEmailTemplate: CTAEmailTemplate
	buildEmail: (templateName, opts)->
		template = templates[templateName]
		opts.siteUrl = settings.siteUrl
		opts.body = template.compiledTemplate(opts)
		if settings.email?.templates?.customFooter?
			opts.body += settings.email?.templates?.customFooter
		return {
			subject : template.subject(opts)
			html: template.layout(opts)
			text: template?.plainTextTemplate?(opts)
		}
