#!/usr/bin/env python
from __future__ import with_statement
from os.path import exists
from os.path import join
from subprocess import PIPE
from subprocess import Popen
from subprocess import call
from sys import version_info
from cStringIO import StringIO
import threading
import sys
import logging

core = None
logger = logging.getLogger("log")

class WebServer(threading.Thread):
    def __init__(self, pycore):
        global core
        threading.Thread.__init__(self)
        self.pycore = pycore
        core = pycore
        self.running = True
        self.server = pycore.config['webinterface']['server']
        self.https = pycore.config['webinterface']['https']
        self.setDaemon(True)
         
    def run(self):
        sys.path.append(join(self.pycore.path, "module", "web"))
        avail = ["builtin"]
        host = self.pycore.config['webinterface']['host']
        port = self.pycore.config['webinterface']['port']
        path = join(self.pycore.path, "module", "web")
        out = StringIO()
        
        if not exists(join(self.pycore.path, "module", "web", "pyload.db")):
            #print "########## IMPORTANT ###########"
            #print "###        Database for Webinterface does not exitst, it will not be available."
            #print "###        Please run: python %s syncdb" % join(self.pycore.path, "module", "web", "manage.py")
            #print "###        You have to add at least one User, to gain access to webinterface: python %s createsuperuser" % join(self.pycore.path, "module", "web", "manage.py")
            #print "###        Dont forget to restart pyLoad if you are done."
            logger.warning(_("Database for Webinterface does not exitst, it will not be available."))
            logger.warning(_("Please run: python %s syncdb") % join(self.pycore.path, "module", "web", "manage.py"))
            logger.warning(_("You have to add at least one User, to gain access to webinterface: python %s createsuperuser") % join(self.pycore.path, "module", "web", "manage.py"))
            logger.warning(_("Dont forget to restart pyLoad if you are done."))
            return None

        try:
            import flup
            avail.append("fastcgi")
        except:
            pass

        try:
            call(["lighttpd", "-v"], stdout=PIPE, stderr=PIPE)
            import flup
            avail.append("lighttpd")

        except:
            pass

        try:
            call(["nginx", "-v"], stdout=PIPE, stderr=PIPE)
            import flup
            avail.append("nginx")
        except:
            pass


        try:
            if exists(self.pycore.config["ssl"]["cert"]) and exists(self.pycore.config["ssl"]["key"]):
                if not exists("ssl.pem"):
                    key = file(self.pycore.config["ssl"]["key"], "rb")
                    cert = file(self.pycore.config["ssl"]["cert"], "rb")

                    pem = file("ssl.pem", "wb")
                    pem.writelines(key.readlines())
                    pem.writelines(cert.readlines())

                    key.close()
                    cert.close()
                    pem.close()

            else:
                self.https = False
        except:
            self.https = False


        if not self.server in avail:
            self.server = "builtin"
            logger.warning(_("Can't use %(server)s, either python-flup or %(server)s is not installed!") % {"server": self.server})


        if self.server == "nginx":

            self.pycore.logger.info(_("Starting nginx Webserver: %s:%s") % (host, port))
            config = file(join(path, "servers", "nginx_default.conf"), "rb")
            content = config.readlines()
            config.close()
            content = "".join(content)

            content = content.replace("%(path)", join(path, "servers"))
            content = content.replace("%(host)", host)
            content = content.replace("%(port)", str(port))
            content = content.replace("%(media)", join(path, "media"))
            content = content.replace("%(version)", ".".join(map(str, version_info[0:2])))

            if self.https:
                content = content.replace("%(ssl)", """
            ssl    on;
            ssl_certificate    %s;
            ssl_certificate_key    %s;
            """ % (self.pycore.config["ssl"]["cert"], self.pycore.config["ssl"]["key"]))
            else:
                content = content.replace("%(ssl)", "")
            
            new_config = file(join(path, "servers", "nginx.conf"), "wb")
            new_config.write(content)
            new_config.close()

            command = ['nginx', '-c', join(path, "servers", "nginx.conf"),]
            self.p = Popen(command, stderr=PIPE, stdin=PIPE, stdout=Output(out))

            import run_fcgi
            run_fcgi.handle("daemonize=false", "method=threaded", "host=127.0.0.1", "port=9295")


        elif self.server == "lighttpd":
            self.pycore.logger.info(_("Starting lighttpd Webserver: %s:%s") % (host, port))
            config = file(join(path, "servers", "lighttpd_default.conf"), "rb")
            content = config.readlines()
            config.close()
            content = "".join(content)

            content = content.replace("%(path)", join(path, "servers"))
            content = content.replace("%(host)", host)
            content = content.replace("%(port)", str(port))
            content = content.replace("%(media)", join(path, "media"))
            content = content.replace("%(version)", ".".join(map(str, version_info[0:2])))

            if self.https:
                content = content.replace("%(ssl)", """
            ssl.engine = "enable"
            ssl.pemfile = "%s"
            ssl.ca-file = "%s"
            """ % (join(self.pycore.path, "ssl.pem"), self.pycore.config["ssl"]["cert"]))
            else:
                content = content.replace("%(ssl)", "")
            new_config = file(join(path, "servers", "lighttpd.conf"), "wb")
            new_config.write(content)
            new_config.close()

            command = ['lighttpd', '-D', '-f', join(path, "servers", "lighttpd.conf")]
            self.p = Popen(command, stderr=PIPE, stdin=PIPE, stdout=Output(out))

            import run_fcgi
            run_fcgi.handle("daemonize=false", "method=threaded", "host=127.0.0.1", "port=9295")

         
        elif self.server == "builtin":
            self.pycore.logger.info(_("Starting django builtin Webserver: %s:%s") % (host, port))

            import run_server
            run_server.handle(host, port)
            #command = ['python', join(self.pycore.path, "module", "web", "run_server.py"), "%s:%s" % (host, port)]
            #self.p = Popen(command, stderr=Output(out), stdin=Output(out), stdout=Output(out))
        else:
            #run fastcgi on port
            import run_fcgi
            run_fcgi.handle("daemonize=false", "method=threaded", "host=127.0.0.1", "port=%s" % str(port))

    def quit(self):

        try:
            if self.server == "lighttpd" or self.server == "nginx":
                self.p.kill()
                #self.p2.kill()
                return True

            else:
                #self.p.kill()
                return True
        except:
            pass

        
        self.running = False

class Output:
    def __init__(self, stream):
        self.stream = stream

    def fileno(self):
        return 1

    def write(self, data): # Do nothing
        return None
         #self.stream.write(data)
         #self.stream.flush()
    def __getattr__(self, attr):
        return getattr(self.stream, attr)