package mtwmapi

import "net/url"

const (
	MsgSourceStore   = 1 //商家
	MsgSourceUser    = 2 //用户
	MsgTypeText      = 1 //文字
	MsgTypePic       = 2 //图片
	MsgTypeVoice     = 3 //语音
	MsgTypeGoodsCard = 4 //商品卡片
	MsgTypeOrderCard = 5 //订单卡片
)

// SingleChat 单聊信息体
type SingleChat struct {
	AppID       int    `json:"app_id"`        //应用标识
	AppPoiCode  string `json:"app_poi_code"`  //门店标识
	Cts         int    `json:"cts"`           //消息发送时间,10位时间戳
	MsgContent  string `json:"msg_content"`   //消息内容
	MsgID       int    `json:"msg_id"`        //消息id，确保消息唯一性，发送消息时，为三方的消息id，接收消息时，为美团的消息id
	MsgSource   int    `json:"msg_source"`    //消息发送方 商家：1，用户：2
	MsgType     int    `json:"msg_type"`      //消息类型： 文字-1; 图片-2;语音-3，注意b2c不支持语音; 商品卡片-4（发送商品卡片类型则不关注msg_content）; 订单卡片-5（订单卡片类型商家只能接收消息，不支持给用户发送消息，只支持单聊）
	OpenUserID  int    `json:"open_user_id"`  //用户id
	OrderID     int    `json:"order_id"`      // 订单id
	AppSpuCodes string `json:"app_spu_codes"` //开放平台侧商品标识（无须加密）
}

// GetConnTokenResp 获取长链接token返回参数
type GetConnTokenResp struct {
	ConnectionToken string `json:"connectionToken"` //建立长连接的token
	UserCount       int    `json:"userCount"`       //30分钟内，消息发送失败的用户数
	AppKey          string `json:"appKey"`          //建立长连接的appkey
}

// ImCallbackMsg im消息回调参数
type ImCallbackMsg struct {
	Timestamp   int    `json:"timestamp"` //调用接口时的时间戳，即当前时间戳（当前距离Epoch（1970年1月1日) 以秒计算的时间，即unix - timestamp），注意传输时间戳与当前北京时间前后相差不能超过10分钟
	AppID       string `json:"app_id"`
	Sig         string `json:"sig"`
	FormData    url.Values
	BizType     int         `json:"biz_type"`     //业务类型字段：1：单聊，2：群聊
	PushContent interface{} `json:"push_content"` //消息体详细内容
}

// PushContentReq msgSend商家发送IM消息
type PushContentReq struct {
	AppID      int    `json:"app_id"`       //美团分配给APP方的id
	AppPoiCode string `json:"app_poi_code"` //APP方门店id，最长不超过128个字符
	MsgID      int    `json:"msg_id"`       //消息id，确保消息唯一性，发送消息时，为三方的消息id，接收消息时，为美团的消息id
	MsgContent string `json:"msg_content"`  //消息内容，需要进行加密。加密方式：使用AES加密算法，加密解密的秘钥取自开放平台APP的secret的前16位，请自行截取。 加密工具：http://tool.chacuo.net/cryptaes
	MsgSource  int    `json:"msg_source"`   //消息发送方，1：商家，2：用户
	MsgType    int    `json:"msg_type"`     //消息类型，1：文字，2：图片，3：语音，注意b2c不支持语音，4：商品卡片，发送商品卡片类型则不关注msg_content，5：订单卡片类型商家只能接收消息，不支持给用户发送消息，只支持单聊 11：群文字，12：群图片，13：群语音，注意b2c不支持语音，14：群商品卡片 其中商品卡片单次最多传7个商品
	Cts        int    `json:"cts"`          //消息发送时间,10位时间戳
	//非必填
	OpenUserID  int    `json:"open_user_id"`  //用户id，单聊时必传
	OrderID     int    `json:"order_id"`      //订单id
	GroupID     int    `json:"group_id"`      //群聊id，发送群聊消息时必传
	AppSpuCodes string `json:"app_spu_codes"` //开放平台侧商品标识（无须加密）
}

type PushContentResp struct {
	ResultCode int         `json:"result_code"` //1-全部操作成功，查询到的数据在data字段中；2-部分成功，成功的数据存储在data字段中，失败的数据存在error_list字段中；3-全部操作失败，失败的数据存在error_list字段中；4-请求失败，一般为签名或限流问题，关注error字段中的具体描述即可
	ErrorList  []ErrorList `json:"error_list"`  //返回失败原因，根据失败原因判断是否重发消息
}

type ErrorList struct {
	Code int    `json:"code"` //错误码
	Msg  string `json:"msg"`  //错误描述
}

// MsgSend 商家发送IM消息 https://open-shangou.meituan.com/home/docDetail/10087
func (a *API) MsgSend(pushContent string) (interface{}, error) {
	retVal, err := a.AccessAPI("ecommerce/IM/msgSend", false, map[string]interface{}{
		"push_content": pushContent,
	})
	//fmt.Println(retVal)
	return retVal, err
}

// GetConnectionToken 获取长连接的token https://developer.waimai.meituan.com/home/docDetail/461
func (a *API) GetConnectionToken() (retVal interface{}, err error) {
	retVal, err = a.AccessAPI("wm/IM/getConnectionToken", false, nil)
	return retVal, err
}

// MsgRead 设置消息已读 https://open-shangou.meituan.com/home/docDetail/465
func (a *API) MsgRead(appPoiCode string, msgID, openUserID int) error {
	_, err := a.AccessAPI("/wm/IM/msgRead", false, map[string]interface{}{
		"app_poi_code": appPoiCode,
		"msg_id":       msgID,
		"open_user_id": openUserID,
	})
	return err
}
