from twisted.web import resource
from twisted.internet import reactor
import time

from hatena import Log, NotFound
from DB import Database
from Hatenatools import UGO

#makes a flipnote list of the most seen ones among the recently uploaded
class PyResource(resource.Resource):
	isLeaf = True
	def __init__(self):
		resource.Resource.__init__(self)
		
		self.pages = []#10 first pages
		self.newestview = None
		self.newestflip = None
		self.Update()
	def render(self, request):
		page = int(request.args["page"][0]) if "page" in request.args else 1
		
		if len(self.pages) >= page:
			path = "/".join(request.path.split("/")[3:])
			Log(request, "%s page %i" % (path, page))
			
			request.responseHeaders.setRawHeaders('content-type', ['text/plain'])
			return self.pages[page-1]
		else:
			return NotFound.render(request)
	#===
	def Update(self):#called every 15 minutes
		reactor.callLater(60*10, self.Update)
		
		if self.newestflip <> Database.Newest[0] or self.newestview <> Database.Views:
			self.newestflip = Database.Newest[0]
			self.newestview = Database.Views
			reactor.callInThread(self.UpdateThreaded, Database.Newest)
	def UpdateThreaded(self, flipnotes):#run in an another thread
		#sort the flipnotes by viewcount, affected by amount of stars
		def sort((i, (ID, flip))):
			views, stars = Database.GetFlipnote(ID, flip)[1:3]
			return int(views)*60 + int(stars)/4 - i
		flipnotes = map(lambda x: x[1], sorted(enumerate(flipnotes), key=sort)[::-1])[:500]
		
		#create pages:
		pages = []
		pagecount = (len(flipnotes)-1)/50 + 1
		if pagecount > 10: pagecount = 10#temp?
		flipcount = len(flipnotes) if len(flipnotes) < 500 else 500
		
		for i in xrange(pagecount):
			pages.append(self.MakePage(flipnotes[i*50:i*50+50], i+1, i<pagecount-1, flipcount))
		
		if self.pages:#not on startup
			print time.strftime("[%H:%M:%S] Updated hotmovies.ugo")
		self.pages = pages
	def MakePage(self, flipnotes, page, next, count):
		ugo = UGO()
		ugo.Loaded = True
		ugo.Items = []
		
		#meta
		ugo.Items.append(("layout", (2, 1)))
		ugo.Items.append(("topscreen text", ["Popular Flipnotes", "Flipnotes", str(count), "", "The most popular new Flipnotes."], 0))
		
		#categories
		ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls", "Most Popular", True))
		ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls", "Most Liked", False))
		#ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/recommended.uls", "Recommended", False))
		ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls", "New Flipnotes", False))
		#ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/following.uls", "New Favourites", False))
		
		#the "post flipnote" button
		ugo.Items.append(("unknown", ("3", "http://flipnote.hatena.com/ds/v2-xx/help/post_howto.htm", "UABvAHMAdAAgAEYAbABpAHAAbgBvAHQAZQA=")))
		
		#previous page
		if page > 1:
			ugo.Items.append(("button", 115, "Previous", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls?page=%i" % (page-1), ("", ""), None))
		
		#Flipnotes
		for creatorid, filename in flipnotes:
			stars = str(Database.GetFlipnote(creatorid, filename)[2])
			ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename+".ppm", Database.GetFlipnoteTMB(creatorid, filename))))
		
		#next page
		if next:
			ugo.Items.append(("button", 115, "Next", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls?page=%i" % (page+1), ("", ""), None))
		
		return ugo.Pack()