package controller

import (
	"encoding/json"
	"github.com/gin-gonic/gin"
	"github.com/gorilla/websocket"
	"github.com/wenstudio/gofly/config"
	"github.com/wenstudio/gofly/models"
	"github.com/wenstudio/gofly/tools"
	"github.com/wenstudio/gofly/user/provider/twong"
	"log"
	"strconv"
)

func PostVisitor(c *gin.Context) {
	name := c.PostForm("name")
	avator := c.PostForm("avator")
	toId := c.PostForm("to_id")
	id := c.PostForm("id")
	refer := c.PostForm("refer")
	city := c.PostForm("city")
	client_ip := c.PostForm("client_ip")
	if name == "" || avator == "" || toId == "" || id == "" || refer == "" || city == "" || client_ip == "" {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "error",
		})
		return
	}
	kefuInfo := models.FindUser(toId)
	if kefuInfo.ID == 0 {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "用户不存在",
		})
		return
	}
	models.CreateVisitor(name, avator, c.ClientIP(), toId, id, refer, city, client_ip)

	userInfo := make(map[string]string)
	userInfo["uid"] = id
	userInfo["username"] = name
	userInfo["avator"] = avator
	msg := TypeMessage{
		Type: "userOnline",
		Data: userInfo,
	}
	str, _ := json.Marshal(msg)
	kefuConns := kefuList[toId]
	if kefuConns != nil {
		for k, kefuConn := range kefuConns {
			log.Println(k, "xxxxxxxx")
			kefuConn.WriteMessage(websocket.TextMessage, str)
		}
	}
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "ok",
	})
}

// post /visitor_login
// 访客第一次连接时请求
func PostVisitorLogin(c *gin.Context) {
	suid := c.PostForm("uid")
	uid, err := strconv.ParseUint(suid, 10, 64)
	if err != nil || uid <= 0 {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "参数错误",
		})
		return
	}
	ipcity := tools.ParseIp(c.ClientIP())
	toId := c.PostForm("to_id")
	refer := c.PostForm("refer")

	var city string
	if ipcity != nil {
		city = ipcity.CountryName + ipcity.RegionName + ipcity.CityName
	} else {
		city = "未识别地区"
	}
	client_ip := c.ClientIP() // c.PostForm("client_ip")

	ut := twong.NewTwongUser()
	v, err := ut.GetVisitorInfo(uid)
	if err != nil {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  err.Error(),
		})
	}
	//log.Println(name,avator,c.ClientIP(),toId,id,refer,city,client_ip)
	if v.Name == "" || v.Avator == "" || toId == "" || v.VisitorId == "" || city == "" || client_ip == "" {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "error",
		})
		return
	}
	if refer == "" {
		refer = "app"
	}
	// 找到客服信息
	kefuInfo := models.FindUser(toId)
	if kefuInfo.ID == 0 {
		c.JSON(200, gin.H{
			"code": 400,
			"msg":  "客服不存在",
		})
		return
	}
	// 插入或更新 访客信息
	models.CreateVisitor(v.Name, v.Avator,
		client_ip, toId, v.VisitorId, refer, city, client_ip)

	visitor := models.FindVisitorByVistorId(v.VisitorId)
	visitor.ToId = toId

	c.JSON(200, gin.H{
		"code":   200,
		"msg":    "ok",
		"result": visitor,
	})
}
func GetVisitor(c *gin.Context) {
	visitorId := c.Query("visitorId")
	vistor := models.FindVisitorByVistorId(visitorId)
	c.JSON(200, gin.H{
		"code":   200,
		"msg":    "ok",
		"result": vistor,
	})
}

// @Summary 获取访客列表接口
// @Produce  json
// @Accept multipart/form-data
// @Param page query   string true "分页"
// @Param token header string true "认证token"
// @Success 200 {object} controller.Response
// @Failure 200 {object} controller.Response
// @Router /visitors [get]
func GetVisitors(c *gin.Context) {
	page, _ := strconv.Atoi(c.Query("page"))
	kefuId, _ := c.Get("kefu_name")
	vistors := models.FindVisitorsByKefuId(uint(page), config.VisitorPageSize, kefuId.(string))
	count := models.CountVisitorsByKefuId(kefuId.(string))
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "ok",
		"result": gin.H{
			"list":     vistors,
			"count":    count,
			"pagesize": config.PageSize,
		},
	})
}

// @Summary 获取访客聊天信息接口
// @Produce  json
// @Accept multipart/form-data
// @Param visitorId query   string true "访客ID"
// @Param token header string true "认证token"
// @Success 200 {object} controller.Response
// @Failure 200 {object} controller.Response
// @Router /messages [get]
func GetVisitorMessage(c *gin.Context) {
	visitorId := c.Query("visitorId")
	kefuId := c.Query("kefuId")
	messages := models.FindMessagesByVisitorAndKefuId(visitorId, kefuId)
	result := make([]map[string]interface{}, 0)
	for _, message := range messages {
		item := make(map[string]interface{})
		var visitor models.Visitor
		var kefu models.User
		if visitor.Name == "" || kefu.Name == "" {
			kefu = models.FindUser(message.KefuId)
			visitor = models.FindVisitorByVistorId(message.VisitorId)
		}
		item["time"] = message.CreatedAt.Format("2006-01-02 15:04:05")
		item["content"] = message.Content
		item["mes_type"] = message.MesType
		item["visitor_name"] = visitor.Name
		item["visitor_avator"] = visitor.Avator
		item["kefu_name"] = kefu.Nickname
		item["kefu_avator"] = kefu.Avator
		result = append(result, item)
	}
	models.ReadMessageByVisitorId(visitorId)
	c.JSON(200, gin.H{
		"code":   200,
		"msg":    "ok",
		"result": result,
	})
}

// @Summary 获取在线访客列表接口
// @Produce  json
// @Success 200 {object} controller.Response
// @Failure 200 {object} controller.Response
// @Router /visitors_online [get]
func GetVisitorOnlines(c *gin.Context) {
	users := make([]map[string]string, 0)
	visitorIds := make([]string, 0)
	for uid, visitor := range clientList {
		userInfo := make(map[string]string)
		userInfo["uid"] = uid
		userInfo["name"] = visitor.name
		userInfo["avator"] = visitor.avator
		users = append(users, userInfo)
		visitorIds = append(visitorIds, visitor.id)
	}

	//查询最新消息
	messages := models.FindLastMessage(visitorIds)
	temp := make(map[string]string, 0)
	for _, mes := range messages {
		temp[mes.VisitorId] = mes.Content
	}
	for _, user := range users {
		user["last_message"] = temp[user["uid"]]
	}

	tcps := make([]string, 0)
	for ip, _ := range clientTcpList {
		tcps = append(tcps, ip)
	}
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "ok",
		"result": gin.H{
			"ws":  users,
			"tcp": tcps,
		},
	})
}
