package wechat

import "encoding/xml"

// FormSignature signature
type FormSignature struct {
	TimeStamp string `form:"timestamp" json:"timestamp"`
	Nonce     string `form:"nonce" json:"nonce"`
	Signature string `form:"signature" json:"signature"`
	Echostr   string `form:"echostr" json:"echostr"`
}

// FormAuthorize get code
type FormAuthorize struct {
	Code  string `form:"code"`
	State string `form:"state"`
	URL   string `form:"url"`
}

// FormOpenID openid
type FormOpenID struct {
	OpenID string `form:"openid"`
}

// FormCode code
type FormCode struct {
	Code string `form:"code"`
}

// ResponseMsg response
type ResponseMsg struct {
	ErrCode int    `json:"errcode"`
	ErrMsg  string `json:"errmsg"`
}

// Response response
type Response struct {
	ErrCode int    `json:"errcode"`
	ErrMsg  string `json:"errmsg"`

	// token
	AccessToken string `json:"access_token"`
	ExpiresIn   int    `json:"expires_in"`

	// openid
	RefreshToken string `json:"refresh_token"`
	OpenID       string `json:"openid"`
	Scope        string `json:"scope"`

	// user info
	NickName   string `json:"nickname"`
	Sex        string `json:"sex"`
	Province   string `json:"province"`
	City       string `json:"city"`
	Country    string `json:"country"`
	HeadImgURL string `json:"headimgurl"`
	Privilege  string `json:"privilege"`
	UnionID    string `json:"unionid"`

	// template message
	MsgID int64 `json:"msgid"`

	// jsapi_ticket
	Ticket string `json:"ticket"`

	// mini get openid by code
	SessionKey string `json:"session_key"`
}

// Message message
type Message struct {
	XMLName      xml.Name `xml:"xml"`
	ToUserName   string   `xml:"ToUserName" json:"ToUserName"`
	FromUserName string   `xml:"FromUserName" json:"FromUserName"`
	CreateTime   int32    `xml:"CreateTime" json:"CreateTime"`
	MsgType      string   `xml:"MsgType" json:"MsgType"`
	MsgID        int64    `xml:"MsgId" json:"MsgId"`
}

// EventTemplateReply event reply
type EventTemplateReply struct {
	XMLName      xml.Name `xml:"xml"`
	ToUserName   string   `xml:"ToUserName"`
	FromUserName string   `xml:"FromUserName"`
	CreateTime   string   `xml:"CreateTime"`
	MsgType      string   `xml:"MsgType"`
	Event        string   `xml:"Event"`
	MsgID        string   `xml:"MsgID"`
	Status       string   `xml:"Status"`
}

// SignPackage sign package
type SignPackage struct {
	AppID     string `json:"appId"`
	NonceStr  string `json:"nonceStr"`
	Timestamp int64  `json:"timestamp"`
	Signature string `json:"signature"`
	URL       string `json:"url"`
}

// Client wechat
type Client struct {
	AppID          string `json:"appid"`
	AppSecret      string `json:"appsecret"`
	Token          string `json:"token"`
	EncodingAESKey string `json:"encodingaeskey"`

	AccessToken   string
	LastTokenTime int64

	Ticket         string
	LastTicketTime int64
}

// MiniClient wechat mini
type MiniClient struct {
	AppID     string `json:"appid"`
	AppSecret string `json:"appsecret"`

	AccessToken   string
	LastTokenTime int64
}

// FormMaterial Material
type FormMaterial struct {
	Type   string `form:"type"`
	Offset int    `form:"offset"`
	Count  int    `form:"count"`
}

// UserInfo userinfo
type UserInfo struct {
	SubScribe      int    `json:"subscribe"`
	OpenID         string `json:"openid"`
	NickName       string `json:"nickname"`
	Sex            int    `json:"sex"`
	Language       string `json:"language"`
	City           string `json:"city"`
	Province       string `json:"province"`
	Country        string `json:"country"`
	HeadImgURL     string `json:"headimgurl"`
	SubscribeTime  int    `json:"subscribe_time"`
	UnionID        string `json:"unionid"`
	Remark         string `json:"remark"`
	GroupID        int    `json:"groupid"`
	TagidList      []int  `json:"tagid_list"`
	SubscribeScene string `json:"subscribe_scene"`
	QrScene        int    `json:"qr_scene"`
	QrSceneStr     string `json:"qr_scene_str"`
}

// List openid list
type List struct {
	OpenID []string `json:"openid"`
}

// UserList user list
type UserList struct {
	Total      int    `json:"total"`
	Count      int    `json:"count"`
	Data       List   `json:"data"`
	NextOpenID string `json:"next_openid"`
}

type newsitem struct {
	Title              string `json:"title"`
	Author             string `json:"author"`
	Digest             string `json:"digest"`
	Content            string `json:"content"`
	ContentSourceURL   string `json:"content_source_url"`
	ThumbMediaID       string `json:"thumb_media_id"`
	ShowCoverPic       int    `json:"show_cover_pic"`
	URL                string `json:"url"`
	ThumbURL           string `json:"thumb_url"`
	NeedOpenComment    int    `json:"need_open_comment"`
	OnlyFansCanComment int    `json:"only_fans_can_comment"`
}

type content struct {
	NewsItem   []*newsitem `json:"news_item,omitempty"`
	CreateTime int         `json:"create_time,omitempty"`
	UpdateTime int         `json:"update_time,omitempty"`
}

type item struct {
	MediaID    string   `json:"media_id"`
	Name       string   `json:"name,omitempty"`
	UpdateTime int      `json:"update_time"`
	URL        string   `json:"url,omitempty"`
	Content    *content `json:"content,omitempty"`
}

// Material 素材
type Material struct {
	TotalCount int    `json:"total_count"`
	ItemCount  int    `json:"item_count"`
	Item       []item `json:"item"`
}

// MiniProgramPage mini
type MiniProgramPage struct {
	AppID    string `json:"appid,omitempty"`
	PagePath string `json:"pagepath,omitempty"`
}

// ValueColor value color
type ValueColor struct {
	Value string `json:"value"`
	Color string `json:"color,omitempty"`
}

// TemplateData data
type TemplateData struct {
	First    *ValueColor `json:"first"`
	Keyword1 *ValueColor `json:"keyword1,omitempty"`
	Keyword2 *ValueColor `json:"keyword2,omitempty"`
	Keyword3 *ValueColor `json:"keyword3,omitempty"`
	Keyword4 *ValueColor `json:"keyword4,omitempty"`
	Keyword5 *ValueColor `json:"keyword5,omitempty"`
	Keyword6 *ValueColor `json:"keyword6,omitempty"`
	Keyword7 *ValueColor `json:"keyword7,omitempty"`
	Keyword8 *ValueColor `json:"keyword8,omitempty"`
	Keyword9 *ValueColor `json:"keyword9,omitempty"`
	Remark   *ValueColor `json:"remark,omitempty"`
}

// TemplateMessage template message
type TemplateMessage struct {
	ToUser      string           `json:"touser"`
	TemplateID  string           `json:"template_id"`
	URL         string           `json:"url"`
	MiniProgram *MiniProgramPage `json:"miniprogram,omitempty"`
	Data        TemplateData     `json:"data"`
}

// MiniTemplateMessage mini template message
type MiniTemplateMessage struct {
	ToUser     string       `json:"touser"`
	TemplateID string       `json:"template_id"`
	Page       string       `json:"page"`
	FormID     string       `json:"form_id"`
	Data       TemplateData `json:"data"`
}

// WeappTemplateMessage mini message
type WeappTemplateMessage struct {
	TemplateID string       `json:"template_id"`
	Page       string       `json:"page"`
	FormID     string       `json:"form_id"`
	Data       TemplateData `json:"data"`
	Emphasis   string       `json:"emphasis_keyword"`
}

// MpTemplateMessage wechat public message
type MpTemplateMessage struct {
	AppID      string          `json:"appid"`
	TemplateID string          `json:"template_id"`
	URL        string          `json:"url"`
	Mini       MiniProgramPage `json:"miniprogram"`
	Data       TemplateData    `json:"data"`
}

// MiniUniformMessage mini uniform send
type MiniUniformMessage struct {
	ToUser string                `json:"touser"`
	WeApp  *WeappTemplateMessage `json:"weapp_template_msg,omitempty"`
	MP     *MpTemplateMessage    `json:"mp_template_msg,omitempty"`
}