from flask.ext.mail import Message

from app import mail, app, get_app_url
from jinja2 import Template, Environment, FileSystemLoader, contextfilter
from data import model
from util.gravatar import compute_hash

def user_reference(username):
  user = model.get_user_or_org(username)
  if not user:
    return username

  return """
  <span>
  <img src="http://www.gravatar.com/avatar/%s?s=16&amp;d=identicon" style="vertical-align: middle; margin-left: 6px; margin-right: 4px;">
  <b>%s</b>
  </span>""" % (compute_hash(user.email), username)


def repository_reference(pair):
  (namespace, repository) = pair

  owner = model.get_user(namespace)
  if not owner:
    return "%s/%s" % (namespace, repository)

  return """
  <span style="white-space: nowrap;">
  <img src="http://www.gravatar.com/avatar/%s?s=16&amp;d=identicon" style="vertical-align: middle; margin-left: 6px; margin-right: 4px;">
  <a href="%s/repository/%s/%s">%s/%s</a>
  </span>
  """ % (compute_hash(owner.email), get_app_url(), namespace, repository, namespace, repository)


def admin_reference(username):
  user = model.get_user(username)
  if not user:
    return 'account settings'

  if user.organization:
    return """
    <a href="%s/organization/%s/admin">organization's admin setting</a>
    """ % (get_app_url(), username)
  else:
    return """
    <a href="%s/user/">account settings</a>
    """ % (get_app_url())


template_loader = FileSystemLoader(searchpath="emails")
template_env = Environment(loader=template_loader)
template_env.filters['user_reference'] = user_reference
template_env.filters['admin_reference'] = admin_reference
template_env.filters['repository_reference'] = repository_reference


def send_email(recipient, subject, template_file, parameters):
  app_title = app.config['REGISTRY_TITLE_SHORT']
  app_url = get_app_url()

  def app_link_handler(url=None, title=None):
    real_url = app_url + '/' + url if url else app_url
    if not title:
      title = real_url if url else app_title

    return '<a href="%s">%s</a>' % (real_url, title)

  parameters.update({    
    'subject': subject,
    'app_logo': 'https://quay.io/static/img/quay-logo.png', # TODO: make this pull from config
    'app_url': app_url,
    'app_title': app_title,
    'app_link': app_link_handler
  })

  rendered_html = template_env.get_template(template_file + '.html').render(parameters)

  msg = Message('[%s] %s' % (app_title, subject), sender='support@quay.io', recipients=[recipient])
  msg.html = rendered_html
  mail.send(msg)


def send_password_changed(username, email):
  send_email(email, 'Account password changed', 'passwordchanged', {
    'username': username
  })

def send_email_changed(username, old_email, new_email):
  send_email(old_email, 'Account e-mail address changed', 'emailchanged', {
    'username': username,
    'new_email': new_email
  })  

def send_change_email(username, email, token):
  send_email(email, 'E-mail address change requested', 'changeemail', {
    'username': username,
    'token': token
  })

def send_confirmation_email(username, email, token):
  send_email(email, 'Please confirm your e-mail address', 'confirmemail', {
    'username': username,
    'token': token
  })

def send_repo_authorization_email(namespace, repository, email, token):
  subject = 'Please verify your e-mail address for repository %s/%s' % (namespace, repository)
  send_email(email, subject, 'repoauthorizeemail', {
    'namespace': namespace,
    'repository': repository,
    'token': token
  })

def send_recovery_email(email, token):
  subject = 'Account recovery'
  send_email(email, subject, 'recovery', {
    'email': email,
    'token': token
  })

def send_payment_failed(email, username):
  send_email(email, 'Subscription Payment Failure', 'paymentfailure', {
    'username': username
  })

def send_org_invite_email(member_name, member_email, orgname, team, adder, code):
  send_email(member_email, 'Invitation to join team', 'teaminvite', {
    'inviter': adder,
    'token': code,
    'organization': orgname,
    'teamname': team
  })


def send_invoice_email(email, contents):
  # Note: This completely generates the contents of the email, so we don't use the
  # normal template here.
  msg = Message('Quay.io payment received - Thank you!',
                sender='support@quay.io',
                recipients=[email])
  msg.html = contents
  mail.send(msg)


# INTERNAL EMAILS BELOW

def send_subscription_change(change_description, customer_id, customer_email, quay_username):
  SUBSCRIPTION_CHANGE_TITLE = 'Subscription Change - {0} {1}'
  SUBSCRIPTION_CHANGE = """
  Change: {0}<br>
  Customer id: <a href="https://manage.stripe.com/customers/{1}">{1}</a><br>
  Customer email: <a href="mailto:{2}">{2}</a><br>
  Quay user or org name: {3}<br>
  """
  
  title = SUBSCRIPTION_CHANGE_TITLE.format(quay_username, change_description)
  msg = Message(title, sender='support@quay.io', recipients=['stripe@quay.io'])
  msg.html = SUBSCRIPTION_CHANGE.format(change_description, customer_id, customer_email,
                                        quay_username)
  mail.send(msg)