package uinapp

// AppID：dqxDP9HwHc5B1dd2db4ek2
// AppKey：Iogz63Q1HL7R4dB8F4Kbn5
// AppSecret：wX4n8IusDn7PfxkGmypzp5
// MasterSecret：J7pU14SwCC7SoUntXJghj8

const (
	appKey       = "Iogz63Q1HL7R4dB8F4Kbn5"
	masterSecret = "J7pU14SwCC7SoUntXJghj8"
	appId        = "dqxDP9HwHc5B1dd2db4ek2"
	appSecret    = "wX4n8IusDn7PfxkGmypzp5"

	BaseUrl           = "https://restapi.getui.com/v2/" // 基础路由
	GetTokenInterface = "/auth"                         // 获取token接口
	PushMsgByCid      = "push/single/cid"               // 通过cId发送消息
)

// AppTokenRes 获取头肯返回值
type AppTokenRes struct {
	Msg  string `json:"msg"`
	Code int    `json:"code"`
	Data struct {
		ExpireTime string `json:"expire_time"`
		Token      string `json:"token"`
	} `json:"data"`
}

// AudienceCid 推送目标用户
type AudienceCid struct {
	CId []string `json:"cid"` // 设备CID只能一个
}

// SendMsgSetting 推送条件设置，详细解释见下方settings说明
type SendMsgSetting struct {
	Ttl      int64 `json:"ttl"` // 消息离线时间设置
	Strategy struct {
		DefaultSetting int64 `json:"default"` //1: 表示该消息在用户在线时推送个推通道，用户离线时推送厂商通道; 2: 表示该消息只通过厂商通道策略下发，不考虑用户是否在线; 3: 表示该消息只通过个推通道下发，不考虑用户是否在线； 4: 表示该消息优先从厂商通道下发，若消息内容在厂商通道代发失败后会从个推通道下发。
		Ios            int64 `json:"ios"`
		Hw             int64 `json:"hw"`
		Ho             int64 `json:"ho"`
		Xm             int64 `json:"xm"`
		Xmg            int64 `json:"xmg"`
		Vv             int64 `json:"vv"`
		Op             int64 `json:"op"`
		Opg            int64 `json:"opg"`
		Mz             int64 `json:"mz"`
		St             int64 `json:"st"`
		Wx             int64 `json:"wx"`
	} `json:"strategy"` // 厂商通道策略
}

// PushMessageDetailNotification 个推安卓消息
type PushMessageDetailNotification struct {
	Title        string `json:"title"`         // 通知消息标题
	Body         string `json:"body"`          // 通知消息内容
	BigText      string `json:"big_text"`      // 长文本消息内容，通知消息+长文本样式，与big_image二选一，两个都填写时报错，长度 ≤ 512字
	BigImage     string `json:"big_image"`     // 大图的URL地址，通知消息+大图样式， 与big_text二选一，两个都填写时报错，URL长度 ≤ 1024字
	Logo         string `json:"logo"`          // 通知的图标名称，包含后缀名
	LogoUrl      string `json:"logo_url"`      // 通知图标URL地址
	ChannelId    string `json:"channel_id"`    // 通知渠道id
	ChannelName  string `json:"channel_name"`  // 通知渠道名称
	ChannelLevel int64  `json:"channel_level"` // 设置通知渠道重要性
	ClickType    string `json:"click_type"`    // 点击通知后续动作 intent：打开应用内特定页面， url：打开网页地址， payload：自定义消息内容启动应用， payload_custom：自定义消息内容不启动应用， startapp：打开应用首页， none：纯通知，无后续动作
	Intent       string `json:"intent"`        // click_type为intent时必填  	点击通知打开应用特定页面
	Url          string `json:"url"`           // click_type为url时必填 点击通知栏消息时，唤起系统默认浏览器打开此链接。必须填写可访问的链接
	Payload      string `json:"payload"`       // click_type为payload/payload_custom时必填  	点击通知时，附加自定义透传消息
	NotifyId     int64  `json:"notify_id"`     // 覆盖任务时会使用到该字段，两条消息的notify_id相同，新的消息会覆盖老的消息
	RingName     string `json:"ring_name"`     // 自定义铃声，请填写文件名，不包含后缀名(需要在客户端开发时嵌入)，个推通道下发有效
	BadgeAddNum  int64  `json:"badge_add_num"` // 角标, 必须大于0, 个推通道下发有效
	ThreadId     string `json:"thread_id"`     // 消息折叠分组，设置成相同thread_id的消息会被折叠（仅支持个推渠道下发的安卓消息）。目前与iOS的thread_id设置无关，安卓和iOS需要分别设置。
}

// PushMessageDetail 个推推送消息参数
type PushMessageDetail struct {
	Duration     string                        `json:"duration"`     // 手机端通知展示时间段，格式为毫秒时间戳段，两个时间的时间差必须大于10分钟
	Notification PushMessageDetailNotification `json:"notification"` // 通知消息内容，仅支持安卓系统，iOS系统不展示个推通知消息，与transmission、revoke三选一，都填写时报错
	Transmission string                        //  	纯透传消息内容，安卓和iOS均支持，与notification、revoke 三选一，都填写时报错，长度 ≤ 3072字
	Revoke       struct {
		OldTaskId string `json:"old_task_id"` // 需要撤回的taskId
		Force     bool   `json:"force"`       // 在没有找到对应的taskId，是否把对应appId下所有的通知都撤回
	} `json:"revoke"` // 撤回消息时使用(仅撤回个推通道消息)
}

// IosPushChannelAlert 厂推消息通知内容
type IosPushChannelAlert struct {
	Title           string   `json:"title"`             // 通知消息标题
	Body            string   `json:"body"`              // 通知消息内容
	ActionLocKey    string   `json:"action-loc-key"`    // （用于多语言支持）指定执行按钮所使用的Localizable.strings
	LocKey          string   `json:"loc-key"`           // （用于多语言支持）指定Localizable.strings文件中相应的key
	LocArgs         []string `json:"loc-args"`          // 如果loc-key中使用了占位符，则在loc-args中指定各参数
	LaunchImage     string   `json:"launch-image"`      // 指定启动界面图片名
	TitleLocKey     string   `json:"title-loc-key"`     // (用于多语言支持）对于标题指定执行按钮所使用的Localizable.strings,仅支持iOS8.2以上版本
	TitleLocArgs    []string `json:"title-loc-args"`    // 对于标题,如果loc-key中使用的占位符，则在loc-args中指定各参数,仅支持iOS8.2以上版本
	Subtitle        string   `json:"subtitle"`          // 通知子标题,仅支持iOS8.2以上版本
	SubtitleLocKey  string   `json:"subtitle-loc-key"`  // 当前本地化文件中的子标题字符串的关键字,仅支持iOS8.2以上版本
	SubtitleLocArgs []string `json:"subtitle-loc-args"` // 当前本地化子标题内容中需要置换的变量参数 ,仅支持iOS8.2以上版本
}

// IosPushChannelAps 推送通知消息内容
type IosPushChannelAps struct {
	Alert            IosPushChannelAlert `json:"alert"`             // 通知消息
	ContentAvailable int64               `json:"content-available"` // 0表示普通通知消息(默认为0)； 1表示静默推送(无通知栏消息)，静默推送时不需要填写其他参数。苹果建议1小时最多推送3条静默消息
	Sound            string              // 自定义铃声，设置为包含后缀名的完整文件名，示例值：ring.mp3 系统铃声，设置为：default无声，设置为：com.gexin.ios.silence，或不填
	Category         string              `json:"category"`      // 在客户端通知栏触发特定的action和button显示
	ThreadId         string              `json:"thread-id"`     // ios的远程通知通过该属性对通知进行分组，仅支持iOS 12.0以上版本
	Timestamp        string              `json:"timestamp"`     // type为liveactivity时必填
	Event            string              `json:"event"`         // type为liveactivity时必填且值为update
	ContentState     struct{}            `json:"content-state"` // type为liveactivity时必填
}

type MultimediaIos struct {
	Url            string `json:"url"`       // 多媒体资源地址
	TypeMultimedia int64  `json:"type"`      // 资源类型（1.图片，2.音频，3.视频）
	OnlyWifi       bool   `json:"only_wifi"` // 是否只在wifi环境下加载，如果设置成true,但未使用wifi时，会展示成普通通知
}

type IosApsDetail struct {
	NotifyType     string            `json:"type"`             // notify默认通知消息 	voip：voip语音推送，notify：apns通知消息，liveactivity：灵动岛推送(不支持p12证书)
	Aps            IosPushChannelAps `json:"aps"`              // 推送通知消息内容
	AutoBadge      string            `json:""`                 // 用于计算icon上显示的数字，还可以实现显示数字的自动增减，如“+1”、 “-1”、 “1” 等，计算结果将覆盖badge
	Payload        string            `json:"payload"`          // 增加自定义的数据
	Multimedia     []MultimediaIos   `json:"multimedia"`       // 多媒体设置
	ApnsCollapseId string            `json:"apns-collapse-id"` // 使用相同的apns-collapse-id可以覆盖之前的消息
}

type AndroidPushChannelUps struct {
	Notification AndroidPushChannelNotification `json:"notification"` // 通知消息内容，与transmission、revoke三选一，都填写时报错。若希望客户端离线时，直接在系统通知栏中展示通知栏消息，推荐使用此参数。
	Transmission string                         `json:"transmission"` // 透传消息内容，与notification、revoke 三选一，都填写时报错，长度 ≤ 3072字
	Revoke       struct {
		OldTaskId string `json:"old_task_id"` // 需要撤回的taskId
	} // 撤回消息时使用(仅撤回厂商通道消息，支持的厂商有小米、VIVO)，与notification、transmission三选一，都填写时报错(消息撤回请勿填写策略参数)
	Options struct {
		Constraint string      `json:"constraint"` // 扩展内容对应厂商通道设置如：ALL,HW,HO,XM(小米国内),XMG(小米海外),VV,OP,OPG(OPPO海外),MZ,UPS(UPS的参数会影响UPS下面的所有机型，比如ST,SN等等)
		Key        string      `json:"key"`        // 厂商内容扩展字段
		Value      interface{} `json:"value"`      // value的设置根据key值决定
	} // 第三方厂商扩展内容
}

// AndroidPushChannelNotification 安卓厂推通知消息
type AndroidPushChannelNotification struct {
	Title     string `json:"title"`      // 通知栏标题（长度建议取最小集）
	Body      string `json:"body"`       // 通知栏内容(长度建议取最小集)
	ClickType string `json:"click_type"` // 点击通知后续动作, 目前支持以下后续动作，intent：打开应用内特定页面(厂商都支持)，url：打开网页地址(厂商都支持；华为/荣耀要求https协议，且游戏类应用不支持打开网页地址)，startapp：打开应用首页(厂商都支持)
	Intent    string `json:"intent"`     // click_type为intent时必填
	Url       string `json:"url"`        // click_type为url时必填
	NotifyId  int64  `json:"notify_id"`  // 消息覆盖使用，两条消息的notify_id相同，新的消息会覆盖老的消息
}

// AndroidPushChannelDetail 安卓厂推
type AndroidPushChannelDetail struct {
	Ups AndroidPushChannelUps `json:"ups"` // android厂商通道推送消息内容
}

// MpPushChannelDetail 小程序厂推
type MpPushChannelDetail struct {
	Wx struct {
		TemplateId       string      `json:"template_id"`        // 所需下发的订阅模板id
		Page             string      `json:"page"`               // 点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转
		MiniProgramState string      `json:"mini_program_state"` // 跳转小程序类型：developer：开发版 trial：体验版formal：正式版
		Lang             string      `json:"lang"`               // 进入小程序查看”的语言类型： zh_CN：简体中文en_US：英文zh_HK：繁体中文zh_TW：繁体中文
		Data             interface{} `json:"data"`               //  	模板内容，格式形如 { "key1": { "value": any }, "key2": { "value": any } }的Json对象
	} `json:"wx"` // 微信小程序通道推送消息内容

}

// PushChannelDetail 厂推消息说明
type PushChannelDetail struct {
	Ios     IosApsDetail             `json:"ios"`     // ios通道推送消息内容
	Android AndroidPushChannelDetail `json:"android"` // android通道推送消息内容
	Mp      MpPushChannelDetail      `json:"mp"`      // miniProgram通道推送消息内容(只支持透传消息)
}

// SendMsgReq 发送msg
type SendMsgReq struct {
	RequestId   string            `json:"request_id"`   // 请求唯一标识号，10-32位之间；如果request_id重复，会导致消息丢失
	GroupName   string            `json:"group_name"`   // 任务组名称
	Audience    AudienceCid       `json:"audience"`     // 推送目标用户
	Settings    SendMsgSetting    `json:"settings"`     // 推送条件设置
	PushMessage PushMessageDetail `json:"push_message"` // 个推推送消息参数
	PushChannel PushChannelDetail `json:"push_channel"` // 厂商推送消息参数，包含ios消息参数，android厂商消息参数
}
