package main

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"strings"
)

type P1001 struct {
	CODE         int          `json:"code"`
	GATEWAY_INFO Gateway_info `json:"gateway_info"`
	DEVICES      []Device     `json:"devices"`
}

type P1004_6 struct {
	CODE    uint16                 `json:"code"`
	ID      string                 `json:"id"`
	VERSION string                 `json:"version"`
	ONLINE  bool                   `json:"online"`
	DATA    map[string]interface{} `json:"data"`
	TIMESTAMP	int64 									`json:"timestamp"`
}

// 发送数据
func send_data(code int, data ...Device) {
	log.Println("************************************************************************")
	data_buf := string(build_data(code, data))
	log.Println(data_buf)
	post_to_server(data_buf)
	log.Println("************************************************************************")
}

// 生成对应code数据
func build_data(code int, data []Device) []byte {
	switch code {
	case 1001:
		var R_data P1001
		R_data.CODE = 1001
		R_data.DEVICES = make([]Device, 0)
		R_data.GATEWAY_INFO = conf.GATEWAY_INFO
		DEVICEDATAS.RLock()
		for _, i := range DEVICEDATAS.DATA {
			R_data.DEVICES = append(R_data.DEVICES, i)
		}
		DEVICEDATAS.RUnlock()
		data_buf, _ := json.Marshal(R_data)
		return data_buf
	case 1004:
		var R_data P1004_6
		R_data.CODE = 1004
		R_data.ID = rl_data.MACADDRESS
		R_data.VERSION = "hk_kll_v1"
		R_data.ONLINE = true
		R_data.DATA = make(map[string]interface{})
		R_data.DATA["starttime"] = rl_data.PEOPLECOUNTING.TIMERANGE.STARTTIME
		R_data.DATA["endtime"] = rl_data.PEOPLECOUNTING.TIMERANGE.ENDTIME
		R_data.DATA["enter"] = rl_data.PEOPLECOUNTING.ENTER
		R_data.DATA["pass"] = rl_data.PEOPLECOUNTING.PASS
		R_data.DATA["exit"] = rl_data.PEOPLECOUNTING.EXIT
		traffic_data.TRAFFIC = traffic_data.TRAFFIC + rl_data.PEOPLECOUNTING.ENTER
		data_buf, _ := json.Marshal(R_data)
		return data_buf
	case 1005:
		var R_data P1004_6
		R_data.CODE = 1005
		R_data.ID = data[0].ID
		R_data.VERSION = data[0].VERSION
		R_data.ONLINE = data[0].ONLINE
		R_data.DATA = data[0].DATA
		data_buf, _ := json.Marshal(R_data)
		return data_buf
	case 1006:
		var R_data P1004_6
		R_data.CODE = 1006
		R_data.ID = pj_data.ID
		R_data.VERSION = "yunhorn_pj_c_v1"
		R_data.ONLINE = true
		R_data.DATA = make(map[string]interface{})
		R_data.DATA["feedback"] = pj_data.FEEDBACK
		switch pj_data.FEEDBACK {
		case "棒棒哒":
			good++
		case "没厕纸":
			bad++
		case "气味难闻":
			bad++
		case "地面湿滑":
			bad++
		case "洗手台不洁":
			bad++
		case "厕位不洁":
			bad++
		case "其他":
			bad++
		}
		var data float64
		data = good / (good + bad)
		satisfaction_data.SATISFACTION = Round(data, 2)
		data_buf, _ := json.Marshal(R_data)
		return data_buf
	}
	return nil
}

// post到服务器
func post_to_server(post_data string) {
	url := conf.POST_TO_SERVER
	//完善 如果没有http前缀,则自动加上
	payload := strings.NewReader("------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"data\"\r\n\r\n" + post_data + "\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--")
	req, error := http.NewRequest("POST", url, payload)
	if error != nil{
		log.Println("new request err:",error)
	}else{
		req.Header.Add("content-type", "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW")
		res, err := http.DefaultClient.Do(req)
		if err != nil {
			log.Println("do post err:",err)
		} else {
			// log.Println("end close resp")
			defer res.Body.Close()
			body, _ := ioutil.ReadAll(res.Body)
			log.Println("post_to_server:", string(body))
		}
	}
	
}