import time, datetime, urllib

from django.core.exceptions import ObjectDoesNotExist
from django.template.defaultfilters import slugify,striptags
from django.core.mail import EmailMessage
from django.utils.encoding import smart_unicode

from strutils import safestr,unquotehtml
from APIClients import MagnoliaClient
import pydelicious as delicious

import markdown2 as markdown
from links.models import Link
from django.conf import settings

def flickr_datetime_to_datetime(fdt):
    from datetime import datetime
    from time import strptime
    date_parts = strptime(fdt, '%Y-%m-%dT%H:%M:%S%Z')
    return datetime(*date_parts[0:6])

def sync_magnolia_links(*args, **kwargs):
    #Number of links to retrieve at one time
    get_num = 15
    BASE_PATH = 'http://ma.gnolia.com/api/rest/1/'
    client = MagnoliaClient(BASE_PATH, settings.MAGNOLIA_API_KEY) 
    data = client.bookmarks_find(person="luxagraf",limit=get_num)
    dupe = False
    for post in data.findall('bookmarks/bookmark'):
        taglist = []
        info = dict((k, smart_unicode(post.get(k))) for k in post.keys())
        try:
            row = Link.objects.get(magnolia_id=safestr(info['id']))
            # If the row exists already, set the dupe flag
            dupe = True
        except ObjectDoesNotExist:
            f = copy_file(safestr(post.findtext('screenshot')), safestr(info['id']))
            local_image_url = "%s/%s.jpg" %(safestr(datetime.datetime.today().strftime("%b").lower()), safestr(info['id']))

            for t in post.findall('tags/tag'):
                tag = dict((k, smart_unicode(t.get(k))) for k in t.keys())
                taglist.append(tag['name'])
                print tag['name']
            for tag in taglist:
                if tag == '2lux':
                    status = 1
                    break
                else: 
                    status = 0
            descr = markdown.markdown(unquotehtml(safestr(post.findtext('description'))), safe_mode = False)
            l, created = Link.objects.get_or_create(
                    title = post.findtext('title'),
                    magnolia_id = safestr(info['id']),
                    url = safestr(post.findtext('url')),
                    description = descr,
                    screen_url = local_image_url,
                    rating = safestr(info['rating']),
                    pub_date = datetime.datetime(*(time.strptime(str(info['created'][:-6]), '%Y-%m-%dT%H:%M:%S')[0:6])),
                    status = status,
                    enable_comments = True,
                    tags = ", ".join(t for t in taglist if t != "2lux")
                )

            email_link(l)
            send_to_delicious(l)
            if l.status == 1:
                post_to_tumblr(l)
                send_to_deliciousfb(l)
        if(dupe):
            break
            
def sync_delicious_links(*args, **kwargs):
    b = delicious.get(settings.DELICIOUS_USER, settings.DELICIOUS_PASS)
    dupe = False
    for post in b['posts']:
        taglist = []
        try:
            row = Link.objects.get(magnolia_id=safestr(post['hash']))
            # If the row exists already, set the dupe flag
            dupe = True
        except ObjectDoesNotExist:
            #f = copy_file(safestr(post.findtext('screenshot')), safestr(info['id']))
            #fake the image since delicious doesn't offer them
            local_image_url = "%s/%s.jpg" %(safestr(datetime.datetime.today().strftime("%b").lower()), safestr(post['hash']))
            tags = str(post['tag']).split(" ")
            for tag in tags:
                taglist.append(tag)
            for tag in taglist:
                if tag == '2lux':
                    status = 1
                    break
                else: 
                    status = 0
            descr = markdown.markdown(unquotehtml(safestr(post['extended'])), safe_mode = False)            
            l, created = Link.objects.get_or_create(
                    title = post['description'],
                    magnolia_id = safestr(post['hash']),
                    url = safestr(post['href']),
                    description = descr,
                    screen_url = local_image_url,
                    #fake the rating since delicious doesn't offer such things
                    rating = "3",
                    pub_date = datetime.datetime.strptime(post['time'], "%Y-%m-%dT%H:%M:%SZ"),
                    status = status,
                    enable_comments = True,
                    tags = ", ".join(t for t in taglist if t != "2lux")
                )

            email_link(l)
            if l.status == 1:
                pass
                post_to_tumblr(l)
                #send_to_deliciousfb(l)
        if(dupe):
            break
 
       
        
    """
     b, created = Link.objects.get_or_create(
            url = info['href'],
            description = info['extended'],
            tags = info.get('tag', ''),
            date = parsedate(info['time']),
            title = info['description']
        )
    for b in bookmarks.bookmarks.bookmark:
        
        try:
            row = Link.objects.get(magnolia_id=safestr(b.id))
            # If the row exists already, set the dupe flag
            print b.title.PCDATA
            dupe = True
        except ObjectDoesNotExist:
            tags=", ".join(t.name for t in b.tags.tag if t.name != "2lux")
            # grab the photo (local copies are good, should I ever change bookmark services)
            local_image_url = "%s/%s.jpg" %(safestr(datetime.datetime.today().strftime("%b").lower()), safestr(b.id))
            f = copy_file(safestr(b.screenshot.PCDATA), safestr(b.id))
            # set the privacy flag (default to false to be on the safe side)
            public = 0
            if safestr(b.private) == 'false': public=1
            # Create and save a new link obj
            l = Link.objects.create(
                    title = safestr(b.title.PCDATA),
                    magnolia_id = safestr(b.id),
                    url = safestr(b.url.PCDATA),
                    description = unquotehtml(safestr(b.description.PCDATA)),
                    screen_url = local_image_url,
                    rating = safestr(b.rating),
                    pub_date = datetime.datetime(*(time.strptime(str(b.created[:-6]), '%Y-%m-%dT%H:%M:%S')[0:6])),
                    status = public,
                    enable_comments = True,
                    
                )
            email_link(l)
            send_to_delicious(l)
        if (dupe):
            break
    """


def email_link(link):
    """
    Sends an imported link to Gmail (never hurts to have backups)
    """
    subject = link.title
    body = "%s\n\n%s\n\n\nvisit site:%s\non ma.gnolia: http://ma.gnolia.com/people/luxagraf/bookmarks/%s\n\non luxagraf: http://luxagraf.net/link/%s/" %(link.title, link.description, link.url, link.magnolia_id, link.id)
    msg = EmailMessage(subject, striptags(body), 'sng@luxagraf.net', ['luxagraf@gmail.com'])
    msg.send()
    
def send_to_delicious(link):
    del_tags = ''
    tags = link.tags.split(',')
    for tag in tags:
       del_tags += tag.strip().replace(' ','_')+' '
    delicious.add(settings.DELICIOUS_USER, settings.DELICIOUS_PASS, link.url, link.title, tags = del_tags, extended = striptags(link.description), dt =safestr(link.pub_date), replace="no")
    
def copy_file(url, id):
    filename="/home/luxagraf/webapps/static/images/magnolia_thumbs/%s/%s.jpg" %(datetime.datetime.today().strftime("%b").lower(), id)
    urllib.urlretrieve(url, filename)
    return id

def post_to_tumblr(link):
    from links import tumblr
    blog = settings.TUMBLR_URL
    user= settings.TUMBLR_USER
    password = settings.TUMBLR_PASSWORD
    api = tumblr.Api(blog,user,password)
    post = api.write_link(link.url,name=link.title,description=link.description,date=safestr(link.pub_date))

def send_to_deliciousfb(link):
    """Wanted my links to go to Facebook and since the Facebook API is needlessly complex
    I just created a second delicious account and added the feed via facebook"""
    del_tags = ''
    tags = link.tags.split(',')
    for tag in tags:
       del_tags += tag.strip().replace(' ','_')+' '
    desc = link.description.replace('<blockquote>','\n&#8220;')
    desc = desc.replace('</blockquote>','&#8221;\n')
    desc = striptags(desc)
    delicious.add(settings.DELTOFACEUSER, settings.DELTOFACEPASS, link.url, link.title, tags = del_tags, extended = desc, dt =safestr(link.pub_date), replace="no")