from __future__ import with_statement

import argparse
import socket

from abl.util import Bunch
from abl.vpath.base import URI
from abl.webconnector import DirectoryConnector
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServer


CONNECTOR = None


class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ("/software",)

    def do_GET(self):
        path = self.path
        path = path.lstrip("/")
        f = URI("memory:///delta")
        if f.exists():
            f.remove()
        CONNECTOR.retrieve_delta_into(path, f)
        with f.open("rb") as inf:
            data = inf.read()

        self.send_response(200)
        self.send_header("Content-type", "application/octet-stream")
        self.end_headers()
        self.wfile.write(data)


def main():
    global CONNECTOR
    parser = argparse.ArgumentParser(description="Ableton Update Delta File Creator")
    parser.add_argument("--port", default=10000, type=int)
    parser.add_argument(
        "--base", required=True, help="The base directory for the delta files to serve."
    )
    default_hostname = socket.gethostname()
    parser.add_argument(
        "--hostname",
        help="Override hostname, default is %s" % default_hostname,
        default=default_hostname,
    )
    opts = parser.parse_args()

    server = SimpleXMLRPCServer(("", opts.port), requestHandler=RequestHandler)

    config = Bunch(app_base_path="/tmp")
    base = URI(opts.base)
    CONNECTOR = DirectoryConnector(config=config, base=base)

    def check_for_auto_updates(frame, args, kwargs):
        return frame, CONNECTOR.check_for_auto_updates(*args)

    def download_link_for_delta(frame, args, kwargs):
        name, = args
        return frame, "http://%s:%i/%s" % (opts.hostname, opts.port, name)

    server.register_function(check_for_auto_updates)
    server.register_function(download_link_for_delta)
    server.serve_forever()


if __name__ == "__main__":
    main()
