package enterprise_wechat

import (
	"errors"
	"git.rosy.net.cn/baseapi/utils"
	"net/http"
)

const (
	MsgTypeText              = "text"               // 文本消息
	MsgTypeImg               = "image"              // 图片消息
	MsgTypeVoice             = "voice"              // 语音消息
	MsgTypeVideo             = "video"              // 视频消息
	MsgTypeFile              = "file"               // 文件消息
	MsgTypeTextCard          = "textcard"           // 文本卡片消息
	MsgTypeNews              = "news"               // 图文消息
	MsgTypeMpNews            = "mpnews"             // 图文消息
	MsgTypeMarkdown          = "markdown"           // markdown消息
	MsgTypeMiniprogramNotice = "miniprogram_notice" // 小程序通知消息
	MsgTypeTemplateCard      = "template_card"      // 模板卡片消息(文本型/图文型/按钮型/投票型/多项选择型)
)

const EnterpriseAgentid = 1000005 // 企业应用的id

// EnterpriseSendMsgReq 发送企业微信文本卡片消息请求参数
type EnterpriseSendMsgReq struct {
	Touser                 string         `json:"touser"`  // 成员ID列表（消息接收者，多个接收者用‘|’分隔，最多支持1000个）
	Toparty                string         `json:"toparty"` // 部门ID列表，多个接收者用‘|’分隔，最多支持100个
	Totag                  string         `json:"totag"`   // 标签ID列表，多个接收者用‘|’分隔，最多支持100个
	Msgtype                string         `json:"msgtype"` // 消息类型，此时固定为：textcard
	Agentid                int            `json:"agentid"` // 企业应用的id
	Textcard               TextCardObject `json:"textcard"`
	EnableIdTrans          int            `json:"enable_id_trans"`          // 	表示是否开启id转译，0表示否，1表示是，默认0
	EnableDuplicateCheck   int            `json:"enable_duplicate_check"`   // 表示是否开启重复消息检查，0表示否，1表示是，
	DuplicateCheckInterval int            `json:"duplicate_check_interval"` // 	表示是否重复消息检查的时间间隔，默认1800s，最大不超过4小时
}

type TextCardObject struct {
	Title       string `json:"title"`       // 标题，不超过128个字节
	Description string `json:"description"` // 描述，不超过512个字节
	Url         string `json:"url"`         // 点击后跳转的链接
	Btntxt      string `json:"btntxt"`      // 按钮文字
}

// EnterpriseSendMsgRes 返回参数
type EnterpriseSendMsgRes struct {
	Errcode        int    `json:"errcode"`        // 返回码
	Errmsg         string `json:"errmsg"`         // 对返回码的文本描述内容
	Invaliduser    string `json:"invaliduser"`    // 不合法的userid，不区分大小写，统一转为小写
	Invalidparty   string `json:"invalidparty"`   // 不合法的partyid
	Invalidtag     string `json:"invalidtag"`     // 不合法的标签id
	Unlicenseduser string `json:"unlicenseduser"` // 没有基础接口许可(包含已过期)的userid
	Msgid          string `json:"msgid"`          // 消息id，用于撤回应用消息
	ResponseCode   string `json:"response_code"`  // 仅消息类型为“按钮交互型”，“投票选择型”和“多项选择型”的模板卡片消息返回，应用可使用response_code调用更新模版卡片消息接口，72小时内有效，且只能使用一次
}

// SendMsgToUser 将消息发送给企业微信用户 msgtype = textcard
func (a *API) SendMsgToUser(msg *EnterpriseSendMsgReq) error {
	a.CheckAccessTokenExpiresIn()
	param := utils.Struct2Map(msg, "", false)
	data, err := a.AccessAPI(WeChatBaseApi, SendMsgToUser, http.MethodPost, param)
	if err != nil {
		return err
	}

	result := &EnterpriseSendMsgRes{}
	if err := utils.Map2StructByJson(data, result, false); err != nil {
		return err
	}
	if result.Errcode != 0 {
		return errors.New(result.Errmsg)
	}

	return nil
}

// 发送文本消息
type SendTextMsgReq struct {
	Touser  string `json:"touser"`
	Toparty string `json:"toparty"`
	Totag   string `json:"totag"`
	Msgtype string `json:"msgtype"`
	Agentid int    `json:"agentid"`
	Text    struct {
		Content string `json:"content"`
	} `json:"text"`
	Safe                   int `json:"safe"`
	EnableIdTrans          int `json:"enable_id_trans"`
	EnableDuplicateCheck   int `json:"enable_duplicate_check"`
	DuplicateCheckInterval int `json:"duplicate_check_interval"`
}

// SendMsgToUserTypeText 发送文本消息给用户
func (a *API) SendMsgToUserTypeText(msg *SendTextMsgReq) error {
	a.CheckAccessTokenExpiresIn()
	param := utils.Struct2Map(msg, "", false)
	data, err := a.AccessAPI(WeChatBaseApi, SendMsgToUser, http.MethodPost, param)
	if err != nil {
		return err
	}

	result := &EnterpriseSendMsgRes{}
	if err := utils.Map2StructByJson(data, result, false); err != nil {
		return err
	}
	if result.Errcode != 0 {
		return errors.New(result.Errmsg)
	}

	return nil
}

// 发送文本消息
type SendMarkdownMsgReq struct {
	Touser   string `json:"touser"`
	Toparty  string `json:"toparty"`
	Totag    string `json:"totag"`
	Msgtype  string `json:"msgtype"`
	Agentid  int    `json:"agentid"`
	Markdown struct {
		Content string `json:"content"`
	} `json:"markdown"`
	Safe                   int `json:"safe"`
	EnableIdTrans          int `json:"enable_id_trans"`
	EnableDuplicateCheck   int `json:"enable_duplicate_check"`
	DuplicateCheckInterval int `json:"duplicate_check_interval"`
}

// SendMsgToUserMarkdown 发送makedown消息
func (a *API) SendMsgToUserMarkdown(msg *SendMarkdownMsgReq) error {
	a.CheckAccessTokenExpiresIn()
	param := utils.Struct2Map(msg, "", false)
	data, err := a.AccessAPI(WeChatBaseApi, SendMsgToUser, http.MethodPost, param)
	if err != nil {
		return err
	}

	result := &EnterpriseSendMsgRes{}
	if err := utils.Map2StructByJson(data, result, false); err != nil {
		return err
	}
	if result.Errcode != 0 {
		return errors.New(result.Errmsg)
	}
	return err
}
