//manage https servers
var getPort    = require('./getPort'),
    async          = require("async"),
    http           = require('http'),
    https          = require('https'),
    fs             = require('fs'),
    net            = require('net'),
    url            = require('url'),
    certMgr        = require("./certMgr"),
    requestHandler = require("./requestHandler");

var DEFAULT_RELEASE_TIME = 120*1000;

module.exports =function(){
    var self = this;
    self.serverList = {
        /* schema sample 
        "www.alipay.com":{
            port:123,
            server : serverInstance,
            lastestUse: 99999 //unix time stamp
        }
        */
    };

    //fetch a port for https server with hostname
    this.fetchPort = function(hostname,userCB){
        var serverInfo = self.serverList[hostname],
            port;

        //server exists
        if(serverInfo){
            console.log("exists :" + hostname );
            serverInfo.lastestUse = new Date().getTime();
            port = serverInfo.port;
            userCB && userCB(null,port);

        //create server with corresponding CA
        }else{
            console.log("creating :" + hostname );
            async.series([
                //find a clean port
                function(callback){
                    getPort(function(cleanPort){
                        port = cleanPort;
                        callback(null,port);
                    });
                }

                //create server  
                ,function(callback){
                    certMgr.getCertificate(hostname,function(err,keyContent,crtContent){
                        var server = createHttpsServer(port,keyContent,crtContent);
                        self.serverList[hostname] = {
                            port   : port,
                            server : server,
                            lastestUse : new Date().getTime()
                        };
                        console.log("https server @port __portNum for __HOST established".replace(/__portNum/,port).replace(/__HOST/,hostname));
                        callback && callback(null,port);
                        
                    });
                }
            ],function(err,result){
                userCB && userCB(err,result[result.length - 1]);
            });
        }
    };

    //clear servers which have been idle for some time
    setInterval(function(){
        var timeNow = new Date().getTime();
        for(var serverName in self.serverList){
            var item = self.serverList[serverName];
            if( (timeNow - item.lastestUse) > DEFAULT_RELEASE_TIME){
                item.server.close();
                delete self.serverList[serverName];
                console.log("https server released : " + serverName);
            }
        }

    },DEFAULT_RELEASE_TIME);
}

function createHttpsServer(port,keyContent,crtContent){
    return https.createServer({
        key : keyContent,
        cert: crtContent
    },requestHandler).listen(port);
}