"""


"""
__version__ = r'''%d'''

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from SocketServer import ThreadingMixIn
import threading
import time
import socket
from optparse import OptionParser

import image_stream

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""


class Handler(BaseHTTPRequestHandler):
    # http://docs.python.org/library/basehttpserver.html#module-BaseHTTPServer
    # client_address
    # command
    # path
    # wfile

    def send_part(self, data, type):
        self.wfile.write('--boundarydonotcross\r\n')
        self.wfile.write('Content-Type: %s\r\n' % type)
        self.wfile.write('Content-Length: %d\r\n\r\n' % len(data))
        self.wfile.write(data)
        self.wfile.write('\r\n')


    def do_GET(self):
        print "GET from", self.client_address, "begins", self.command, self.path, 'thread:',threading.currentThread().getName()

        if self.path == "/test":
            self.send_response(200)
            self.send_header("Content-type", "text/plain")
            msg = "Hello, World!\n"
            self.send_header("Content-Length", len(msg))
            self.end_headers()
            self.wfile.write(msg)
            return

        if self.path.startswith("/stream"):
            self.send_response(200)
            self.send_header("Content-type", "multipart/x-mixed-replace;boundary=boundarydonotcross")
            self.end_headers()
            
            try:
                print "stream started to ", self.client_address, 'thread:',threading.currentThread().getName()
                me = threading.currentThread().getName()
                count = 0
                local = threading.local()
                while self.retriever.keep_running():
                    count += 1
                    if self.path.endswith("test"):
                        self.send_part("Hello %d" % count, "text/plain")
                        time.sleep(1)
                    else:
                        fps = 10
                        self.send_part(image_stream.next_frame(local,fps), 'image/jpeg')
                        
            except socket.error, e:
                if e.args[0] == 32:
                    # broken pipe
                    print "stream ended to ", self.client_address
                    return
                raise e

            return # not really reached

        
        self.send_response(404)
        self.end_headers()

#def run(server_class=BaseHTTPServer.HTTPServer,
#        handler_class=RequestHandler):
#    server_address = ('', 8000)
#    httpd = server_class(server_address, handler_class)
#    httpd.serve_forever()


def run():
    global options

    parser = OptionParser(usage="%prog [options] input-location",
                          version=__version__)
    parser.set_defaults(verbose=True)
    parser.set_defaults(port=8080)
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose", 
                      help="don't print status messages to stderr")
    parser.add_option("-D", "--debug",
                      action="append", dest="debugTags", 
                      help="turn on debugging of a particular type (try 'all')")
    parser.add_option("-p", "--port", action="store", dest="port",
                      help="Port number on which to provide HTTP service")


    (options, args) = parser.parse_args()

    if options.debugTags:
        debugtools.tags.update(options.debugTags)

    if len(args) != 1:
        parser.print_help()
        sys.exit(1)

    # 'http://127.0.0.1:8432/?action=stream'
    url = args[0]
    port = int(options.port)

    retriever = image_stream.Retriever()
    retriever.daemon = True
    retriever.url = url
    retriever.start()
    Handler.retriever = retriever
    try:
        server = ThreadedHTTPServer(('', port), Handler)
        print 'Starting server, use <Ctrl-C> to stop'
        server.serve_forever()
    finally:
        retriever.stop()
        print "Told retriever to stop running, but....   will it?"


if __name__ == '__main__':
    import doctest, sys
    doctest.testmod(sys.modules[__name__])

    run()

