#!/usr/bin/python3

import http.server
import json
import urllib.parse
import os
import sys

index = None
indexmtime = None
def loadIndex():
	global index
	global indexmtime

	with open("/var/lib/regindexer/index/flatpak.json") as indexfile:
		newindexmtime = os.stat(indexfile.fileno()).st_mtime
		if index is None or indexmtime != newindexmtime:
			print("Loading index")
			index = json.load(indexfile)
			indexmtime = newindexmtime

	return index

def filterImages(result, tag):
	"""Returns images in result which have the given tag"""
	result["Images"] = [image for image in result["Images"] if tag in image["Tags"]]
	return result

def handleQuery(repo, query):
	index = loadIndex()
	tag = "stable" if not "tag" in query else query["tag"][0]

	results = [result for result in index["Results"] if result["Name"].startswith(repo)]
	results = [filterImages(result, tag) for result in results]
	results = [result for result in results if len(result["Images"])]

	return {"Registry": index["Registry"], "Results": results}

class IndexHandler(http.server.BaseHTTPRequestHandler):
	def do_GET(self, *args):
		parsedurl = urllib.parse.urlparse(self.path)
		path = parsedurl.path
		query = urllib.parse.parse_qs(parsedurl.query)

		pathelems = path.strip("/").split("/")
		if pathelems[-2:] != ["index", "static"]:
			self.send_error(404)
			return

		repo = "opensuse/flatpak"
		if len(pathelems) > 2:
			repo = "/".join(pathelems[:-2]) + "/"
		responseobj = handleQuery(repo, query)

		responsebytes = json.dumps(responseobj).encode("ascii")
		self.send_response(200)
		self.send_header("Content-type", "application/json")
		self.send_header("Content-size", len(responsebytes))
		self.end_headers()
		self.wfile.write(responsebytes)

addr = (sys.argv[1], int(sys.argv[2]))
#server = http.server.ThreadingHTTPServer(addr, IndexHandler)
server = http.server.HTTPServer(addr, IndexHandler)
server.serve_forever()
