#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import sys
import re
import os
import zlib

import random
import time

import src.settings as settings
from src.Handler import Handler
from src.LoggingClasses import RotationLogger


def printEnviron(environ, logger):
    for key, value in environ.items():
        settings.logger.info("Environ: " + str(key) + " " + str(value))

def application(environ, start_response):

    appSettings = settings.Config(environ.get('CONTEXT_DOCUMENT_ROOT', 0), "config.txt")
    appSettings.initConfiguration()
    
    
    
    
    
    settings.logger.debug('backend_wsgi: enetered application()')  
    settings.logger.debug("Current Path:" + os.getcwd())
    settings.logger.info("Remote IP: {_ip}".format(_ip=environ.get("REMOTE_ADDR")))

    try:
       	request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError) as e:
	settings.logger.error(str(e))
        request_body_size = 0	

    
    try:
        content_encoding = environ.get("HTTP_CONTENT_ENCODING", "")
        #logger.debug(str(environ))
    except (ValueError) as e:
        content_encoding = ""

    #settings.logger.debug("Request Body Size: " + str(request_body_size))
    xml_msg = ""    
    try:
        data = environ["wsgi.input"].read(request_body_size)

        if content_encoding == "gzip":
            settings.logger.debug("Compressed Content: gzip")
            try:
                xml_msg = zlib.decompress(data, 16+zlib.MAX_WBITS)
            except Exception as e:
                settings.logger.error(str(e))
        else:
            xml_msg = data

    except (IOError) as e:
        settings.logger.error("Remote IP: {_ip} - Request Body Size: {_size}".format(_ip=environ.get("REMOTE_ADDR"), 
                                                                                     _size=request_body_size))
        settings.logger.error(str(e))

    '''try:
        splittedMsg = xml_msg.split(" ")
        if 'slid' in splittedMsg[1]:
            lid = splittedMsg[1][6:-1]
            newFormatStr = '%(asctime)s - ' + lid + ' - %(process)s - %(name)s - %(levelname)s - %(message)s'
            settings.logger.changeFormatter(newFormatStr)
    except Exception as e:
        settings.logger.error(str(e))'''

    settings.logger.info('************************************* RECEIVED MSG: ' + xml_msg)
    msg_handler = Handler(xml_msg) 

    if re.search('setDevice', xml_msg, re.IGNORECASE) != None:        
    	msg_handler.handleSetDevice()

    if re.search('setData', xml_msg, re.IGNORECASE) != None:
        
        if re.search('P1712008', xml_msg, re.IGNORECASE) != None:
            setting.logger.info('FOUND P1712008 - switch routing')
            msg_handler = Handler(xml_msg)
            msg_handler.handle_set_data()
        
    	msg_handler.handle_set_data() 

    settings.logger.info('************************************* RETURNED MESSAGE: ' + msg_handler.response_msg)

    status = '200 OK'

    response_headers = [
       	('Content-Type', 'application/xml'),
       	('Content-Length', str(len(msg_handler.response_msg)))
    	]

    start_response(status, response_headers) 

    return_string = msg_handler.response_msg
    msg_handler.responseMsg = None
    msg_handler = None

    return [return_string]

	
