import subprocess
from datetime import datetime, timedelta
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formatdate, make_msgid, parseaddr
from flask import json, jsonify, make_response, g, current_app as app
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.login import LoginManager

db = SQLAlchemy()
login_manager = LoginManager()

def localtime(dt, tz=None):
  """
  Returns the time with tzinfo tz even if the datetime
  passed (dt) is a primitive type.
  """
  try:
    dt = pytz.utc.localize(dt)
    if tz:
      return dt.astimezone(tz)
    else:
      return dt.astimezone(app.tz)
  except Exception, e:
    return dt

def strftime(dt, format):
  try:
    return dt.strftime(str(format))
  except:
    return dt

def call(command='', args=[]):
  if command:
    args = command.split(' ')
  app.logger.debug('Calling: %s' % ' '.join(args))
  try:
    result = subprocess.check_output(args, stderr=subprocess.STDOUT)
  except subprocess.CalledProcessError, e:
    app.logger.exception('Call failed: %s' % ' '.join(args))
  else:
    return result

def base36encode(number):
  assert number >= 0, 'Positive integer required'
  if number == 0:
    return '0'
  base36 = []
  while number != 0:
    number, i = divmod(number, 36)
    base36.append('0123456789abcdefghijklmnopqrstuvwxyz'[i])
  return ''.join(reversed(base36))

def base36decode(number):
  return int(number, 36)

def rgb2hex(rgbcolor):
  """Convert a tuple of (r, g, b) to the hex equivilent."""
  return '#%02x%02x%02x' % rgbcolor

def hex2rgb(hexcolor):
  """Convert a hex color to a (r, g, b) tuple equivilent."""
  hexcolor = hexcolor.strip('\n\r #')
  if len(hexcolor) != 6:
    raise ValueError('Input #%s not in #rrggbb format' % hexcolor)
  r, g, b = hexcolor[:2], hexcolor[2:4], hexcolor[4:]
  return [int(n, 16) for n in (r, g, b)]

def adjustrgb(rgbcolor, percent):
  """
  Shift a color to a darker or lighter shade.
  
  This is a hack and will break on edge cases. Could be done more
  effectively by converting to HSL, adjusting, and converting back.
  """
  percent = 1 + (float(percent) / 100)
  return tuple(int(x * percent) for x in rgbcolor)

def send_email(msg_to, msg_subject, msg_body, msg_from=None,
        smtp_server='localhost', envelope_from=None,
        headers={}):

  if not msg_from:
    msg_from = app.config['EMAIL_FROM']

  if not envelope_from:
    envelope_from = parseaddr(msg_from)[1]

  msg = MIMEText(msg_body)

  msg['Subject'] = Header(msg_subject)
  msg['From'] = msg_from
  msg['To'] = msg_to
  msg['Date'] = formatdate()
  msg['Message-ID'] = make_msgid()
  msg['Errors-To'] = envelope_from

  if request:
    msg['X-Submission-IP'] = request.remote_addr

  s = smtplib.SMTP(smtp_server)
  s.sendmail(envelope_from, msg_to, msg.as_string())
  s.close()