#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
sys.path.insert(0, "/home/heng890331/packages/lib/python2.7/site-packages")
from fcgi import WSGIServer
from cgi import parse_qs
import cgitb
cgitb.enable(display=0, logdir="/home/heng890331/exception.txt")
import hashlib
import logging
import time
import json
import httplib
logging.basicConfig(filename="/home/heng890331/log.txt", level=logging.DEBUG)

import xml.etree.ElementTree as ElementTree

RespondXmlForm = u"""
<xml>
  <ToUserName><![CDATA[{ToUserName}]]></ToUserName>
  <FromUserName><![CDATA[{FromUserName}]]></FromUserName>
  <CreateTime>{CreateTime}</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[{Content}]]></Content>
</xml>
"""

UserRegisterJSONForm = u"""
{{
  "user_token": "{user_token}"
}}
"""

def getRequestHandler(environ, start_response):
    logging.debug("dispatch")
    start_response('200 OK', [('Content-Type', 'text/plain')])
    
    signature = args.get("signature", [""])[0]
    timestamp = args.get("timestamp", [""])[0]
    nonce = args.get("nonce", [""])[0]
    echostr = args.get("echostr", [""])[0]
    token = "gentosflowmeter"
    
    list = [token, timestamp, nonce]
    list.sort()
    
    sha1 = hashlib.sha1()
    
    map(sha1.update, list)
    hashcode = sha1.hexdigest()
    logging.debug("hashcode: " + hashcode)
    if hashcode == signature:
        returnStr = echostr
        logging.debug("Verified")
    else:
        logging.debug("Verification Failed")
        
    logging.debug("dispatch_end")
    yield returnStr

def sendRequest(path, contentObject):
    HOST = "api.gentos.hengxiao.net"
    HEADER = {"Content-Type": "application/json", "Accept": "application/json"}
    connection = httplib.HTTPConnection(HOST)
    content = json.dumps(contentObject).encode("utf-8")
    connection.request("POST", path, content, HEADER)
    response = connection.getresponse()
    payload = response.read()
    ok = True
    try:
        payload = json.loads(payload)
    except:
        payload = {"orig_content": payload}
        ok = False
    if (response.status == 200):
        return {"status": 200, "payload": payload, "ok": ok}
    return {"status": response.status, "payload": payload, "errormsg": response.reason, "ok": ok}

def registerUser(user):
    response = sendRequest("/v1/user/auth/register", {"user_token": user})
    if response["status"] == 200:
        return u"注册成功"
    if response["status"] == 403:
        return u"你已经成功注册过，可以直接使用"
    return json.dumps(response["payload"])
    

def registerFlowmeter(user, flowmeter, nickname):
    response = sendRequest("/v1/user/flowmeter/link", {"user_token": user, "flowmeter_serial_number": flowmeter, "flowmeter_nickname": nickname})
    return json.dumps(response["payload"], indent=2)

def getFlowmeterList(user):
    response = sendRequest("/v1/user/flowmeter/list", {"user_token": user})
    result = u"你注册了的流量计如下："
    if response["status"] != 200:
        return u"请求失败\n" + json.dumps(response["status"], indent=2)
    if len(response["payload"]) == 0:
        result = result + u"\n[尚无注册流量计]"
    for flowmeter in response["payload"]:
        result = result + u"\n" + flowmeter["nickname"]
    return result

def getFlow(user, nickname):
    response = sendRequest("/v1/user/flow/view", {"user_token": user, "flowmeter_nickname": nickname})
    if response["status"] != 200:
        return u"请求失败\n" + json.dumps(response["status"], indent=2)
    resultObj = response["payload"]
    if response["ok"] == False:
        return u"尚无任何数据"
    return u"流量：" + str(resultObj["value"]) + u"\n测量时间：" + resultObj["measure_time"]

def getContent(user, request_content):
    command = request_content.split()
    if command[0] == u"注册用户":
        return u"" + registerUser(user)
    if command[0] == u"注册流量计":
        if len(command) < 3:
            return u"请在“注册流量计”命令后加上流量计的特征码和名字"
        return u"" + registerFlowmeter(user, command[1], command[2]) 
    if command[0] == u"流量计列表":
        return getFlowmeterList(user)
    if command[0] == u"流量计读数":
        if len(command) < 2:
            return u"请在“流量计读数”命令后加上流量计的名字"
        return getFlow(user, command[1])
    return u"""可用的命令如下：
1.注册用户
2.注册流量计　【流量计ID】　【用户想给的流量计名称】
3.流量计列表
4.流量计读数　【流量计名称】"""

def postRequestHandler(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    try:
        request_body_size = int(environ.get("CONTENT_LENGTH", 0))
    except:
        request_body_size = 0
    args = parse_qs(environ["QUERY_STRING"])
    request_body = environ["wsgi.input"].read(request_body_size)
    xml = ElementTree.fromstring(request_body)
    request_data = {}
    for child in xml:
        request_data[child.tag] = child.text

    content = ""
    if request_data["MsgType"] != "text":
        content = "No audio, video, picture is supported"
    else:
        content = getContent(request_data["FromUserName"], request_data["Content"])
    
    respond_data = {
        "ToUserName": request_data["FromUserName"],
        "FromUserName": request_data["ToUserName"],
        "MsgType": "text",
        "Content": content,
        "CreateTime": time.time(),
    }

    respond_body = RespondXmlForm.format(**respond_data)
    yield respond_body.encode("utf-8")

def wechatHandler(environ, start_response):
    if environ["REQUEST_METHOD"] == "GET":
        return getRequestHandler(environ, start_response)
    else:
        return postRequestHandler(environ, start_response)



WSGIServer(wechatHandler).run()
#print getFlow("haha", "hehe")
