#!/usr/bin/env python

import pymongo
import time
import urllib, magic
import os, sys, traceback
import ConfigParser


from pymongo import Connection
connection = Connection()

conf = ConfigParser.SafeConfigParser()
conf.read("thumb.conf")

db = connection.r2d2

collection = db.thumbnails
queue = db.thumbnailsQueue

baseUrl = conf.get("general", "baseUrl")

dataDir = conf.get("general", "dataDir")
rawDir = dataDir + "/raw/"
thumbDir = dataDir + "/thumbs/"

magicMime = magic.Magic(mime="true")

if not os.path.exists(rawDir):
    os.makedirs(rawDir)
if not os.path.exists(thumbDir):
    os.makedirs(thumbDir)

def atomicSet(el, field, value):
    #queue.update({"_id": el["_id"]}, {"$set": {field: value}})
    return queue.update(el, {"$set": {field: value}}, False, False, True)


def ensurePdf(fileName, rawFileName):
    mime = magicMime.from_file(rawFileName)

    print "found mime " + mime

    if mime == "application/pdf":
        return fileName

    os.remove(rawFileName)

def download(el):
    id = el["id"]
    url = el["url"]
    if not url:
        return None

    print "downloading %s" % (url)

    webFile = urllib.urlopen(url)

    fileName = id.replace("/", "__")
    rawFileName = rawDir + fileName

    localFile = open(rawFileName, "w")
    localFile.write(webFile.read())
    localFile.close()

    return ensurePdf(fileName, rawFileName)



def generateThumbnail(el, doc):
    print "generating thumbnail for pdf " + doc

    cmd="convert -define png:size=100x100 -background transparent -gravity center -thumbnail 100x100 -extent 100x100 %s %s" 
    os.system(cmd % (rawDir+doc + "[0]", thumbDir+doc + ".png"))

    os.remove(rawDir+doc)

    return doc + ".png"

def saveThumbnail(el, thumb):
    thumbUrl = None
    if thumb:
        thumbUrl = baseUrl + thumb
    collection.insert({"id": el["id"], "url": thumbUrl})

def process(el):
    print "processing %s" % (el)
    gotit = atomicSet(el, "status", "accepted")
    if not gotit["updatedExisting"]:
        print "NOT ACCEPTED SKIPPING"
        return

    doc = download(el)

    thumb = None
    if doc:
        thumb = generateThumbnail(el, doc)

    atomicSet(el, "status", "done")

    saveThumbnail(el, thumb)

    atomicSet(el, "status", "deleted")

    print "processed"


waiting = False
while True:
    res = queue.find({"status": "new"}).sort("timestamp", pymongo.DESCENDING)
    if res.count() > 0:
        waiting = False
        try:
            process(res[0])
        except IndexError:
            print "queue record stolen"
        except:
            print "got exception"
            traceback.print_exc(file=sys.stdout)
            pass
    else:
        if not waiting:
            print "waiting"
        waiting = True
        time.sleep(0.1)

