package structs

type Department struct {
	Id       int64    `json:"id"`
	ParentId int64    `json:"parentid,omitempty"`
	Order    int      `json:"order,omitempty"`
	Name     string   `json:"name,omitempty"`
	NameEn   string   `json:"name_en,omitempty"`
	Leader   []string `json:"department_leader,omitempty"`
}

type DepartmentId struct {
	Id       int64 `json:"id"`
	ParentId int64 `json:"parentid"`
	Order    int   `json:"order"`
}

type DepUser struct {
	OpenUserId string `json:"open_userid"`
	Department int64  `json:"department"`
}

type SimpleUser struct {
	Userid     string  `json:"userid"`
	Name       string  `json:"name"`
	OpenUserid string  `json:"open_userid"`
	Department []int64 `json:"department"`
}

type UserInfo struct {
	Userid  string `json:"userid"`
	Name    string `json:"name"`
	Gender  string `json:"gender"`
	Avatar  string `json:"avatar"`
	QrCode  string `json:"qr_code"`
	Mobile  string `json:"mobile"`
	Email   string `json:"email"`
	BizMail string `json:"biz_mail"`
	Address string `json:"address"`
}

type UserInfoWithCode struct {
	Userid string `json:"userid"`
	OpenId string `json:"openid"`
}

type UserIdReq struct {
	UseridList []string `json:"userid_list"`
}

type OpenUserId struct {
	OpenUseridList    []OpenUserIdInfo `json:"open_userid_list"`
	InvalidUseridList []string         `json:"invalid_userid_list"`
}

type OpenUserIdInfo struct {
	Userid     string `json:"userid"`
	OpenUserid string `json:"open_userid"`
}

type ExternalUserIds struct {
	Items []ExternalUserIdItem `json:"items"`
}

type ExternalUserIdItem struct {
	ExternalUserid    string `json:"external_userid"`
	NewExternalUserid string `json:"new_external_userid"`
}

type BatchUserId struct {
	UseridList []string `json:"userid_list"`
	Cursor     string   `json:"cursor"`
	Limit      int      `json:"limit"`
}

type BatchUserIdRes struct {
	ExternalContactList []ExternalContactDetail `json:"external_contact_list"`
	NextCursor          string                  `json:"next_cursor"`
}

type FollowUser struct {
	Userid         string          `json:"userid"` //添加了此外部联系人的企业成员userid
	Remark         string          `json:"remark"` //该成员对此外部联系人的备注
	Description    string          `json:"description"`
	Tags           []Tag           `json:"tags,omitempty"`
	TagIds         []string        `json:"tag_id,omitempty"`
	RemarkMobiles  []string        `json:"remark_mobiles,omitempty"`   //该成员对此客户备注的手机号码,代开发自建应用需要管理员授权才可以获取,第三方不可获取,上游企业不可获取下游企业客户该字段
	RemarkCorpName string          `json:"remark_corp_name,omitempty"` //该成员对此微信客户备注的企业名称(仅微信客户有该字段)
	OperUserid     string          `json:"oper_userid"`
	State          string          `json:"state,omitempty"`
	CreateTime     int64           `json:"createtime"`
	AddWay         int             `json:"add_way"` //该成员添加此客户的来源
	WechatChannels *WechatChannels `json:"wechat_channels,omitempty"`
}

// add_way表示添加客户的来源,有固定的值,而state表示此客户的渠道,可以由企业进行自定义的配置,请注意二者的不同。
//
// 值	含义
// 0	未知来源
// 1	扫描二维码
// 2	搜索手机号
// 3	名片分享
// 4	群聊
// 5	手机通讯录
// 6	微信联系人
// 8	安装第三方应用时自动添加的客服人员
// 9	搜索邮箱
// 10	视频号添加
// 11	通过日程参与人添加
// 12	通过会议参与人添加
// 13	添加微信好友对应的企业微信
// 14	通过智慧硬件专属客服添加
// 15	通过上门服务客服添加
// 201	内部成员共享
// 202	管理员/负责人分配
const (
	Kway = 0
)

type Tag struct {
	GroupName string `json:"group_name"`
	TagName   string `json:"tag_name"`
	TagId     string `json:"tag_id"`
	Type      int    `json:"type"`
}

type WechatChannels struct {
	Nickname string `json:"nickname"`
	Source   int    `json:"source,omitempty"`
}

type ExternalProfile struct {
	ExternalAttr     []Attribute    `json:"external_attr,omitempty"`
	WechatChannels   WechatChannels `json:"wechat_channels,omitempty"`
	ExternalCorpName string         `json:"external_corp_name,omitempty"`
}

type Attribute struct {
	Type        int                   `json:"type"`
	Name        string                `json:"name"`
	Text        *AttributeText        `json:"text,omitempty"`
	Web         *AttributeWeb         `json:"web,omitempty"`
	MiniProgram *AttributeMiniProgram `json:"miniprogram,omitempty"`
}

type AttributeText struct {
	Value string `json:"value"`
}

type AttributeWeb struct {
	Url   string `json:"url"`
	Title string `json:"title"`
}

type AttributeMiniProgram struct {
	Appid    string `json:"appid"`
	PagePath string `json:"pagepath"`
	Title    string `json:"title"`
}

type ExternalContact struct {
	ExternalUserid  string           `json:"external_userid"`
	Name            string           `json:"name"`
	Position        string           `json:"position"`
	Avatar          string           `json:"avatar"`
	CorpName        string           `json:"corp_name"`
	CorpFullName    string           `json:"corp_full_name"`
	UnionId         string           `json:"unionid"`
	Type            int              `json:"type"`
	Gender          int              `json:"gender"`
	ExternalProfile *ExternalProfile `json:"external_profile,omitempty"`
}

type ExternalContactDetail struct {
	ExternalContact ExternalContact `json:"external_contact"`
	FollowInfo      *FollowUser     `json:"follow_info,omitempty"` //for batch
	FollowUser      []FollowUser    `json:"follow_user,omitempty"` // for detail
}

type ExternalRemark struct {
	Userid           string   `json:"userid"`
	ExternalUserid   string   `json:"external_userid"`
	Remark           string   `json:"remark"`
	Description      string   `json:"description"`
	RemarkCompany    string   `json:"remark_company"`
	RemarkPicMediaId string   `json:"remark_pic_mediaid"`
	RemarkMobiles    []string `json:"remark_mobiles"`
}

type DepMember struct {
	Userid           string           `json:"userid"`
	Name             string           `json:"name,omitempty"`
	Alias            string           `json:"alias,omitempty"`
	Mobile           string           `json:"mobile,omitempty"`
	Position         string           `json:"position,omitempty"`
	Gender           string           `json:"gender,omitempty"`
	Email            string           `json:"email,omitempty"`
	BizMail          string           `json:"biz_mail,omitempty"`
	AvatarMediaId    string           `json:"avatar_mediaid,omitempty"`
	OpenUserid       string           `json:"open_userid,omitempty"`
	Avatar           string           `json:"avatar,omitempty"`
	ThumbAvatar      string           `json:"thumb_avatar,omitempty"`
	Telephone        string           `json:"telephone,omitempty"`
	Address          string           `json:"address,omitempty"`
	QrCode           string           `json:"qr_code,omitempty"`
	ExternalPosition string           `json:"external_position"`
	ToInvite         bool             `json:"to_invite,omitempty"`
	Enable           int              `json:"enable"`
	Status           int              `json:"status,omitempty"`
	MainDepartment   int64            `json:"main_department"`
	Department       []int64          `json:"department,omitempty"`
	IsLeaderInDept   []int64          `json:"is_leader_in_dept,omitempty"`
	Order            []int            `json:"order,omitempty"`
	DirectLeader     []string         `json:"direct_leader,omitempty"`
	Extattr          *Attribute       `json:"extattr,omitempty"`
	ExternalProfile  *ExternalProfile `json:"external_profile,omitempty"`
}

type TagGroup struct {
	GroupId    string         `json:"group_id"`
	GroupName  string         `json:"group_name"`
	CreateTime int64          `json:"create_time"`
	Order      int            `json:"order"`
	StrategyId int            `json:"strategy_id,omitempty"`
	Deleted    bool           `json:"deleted"`
	Tag        []TagGroupItem `json:"tag"`
}

type TagGroupItem struct {
	Id         string `json:"id"`
	Name       string `json:"name"`
	CreateTime int64  `json:"create_time"`
	Order      int    `json:"order"`
	Deleted    bool   `json:"deleted"`
}

type AddTagReq struct {
	GroupId   string    `json:"group_id"`
	GroupName string    `json:"group_name"`
	Order     int       `json:"order"`
	AgentId   int64     `json:"agentid,omitempty"` //授权方安装的应用agentid。仅旧的第三方多应用套件需要填此参数
	Tag       []TagInfo `json:"tag"`
}

type AddStrategyTagReq struct {
	AddTagReq
	StrategyId int `json:"strategy_id"`
}

type TagInfo struct {
	Name  string `json:"name"`
	Order int    `json:"order"`
}

type EditTagReq struct {
	Id      string `json:"id"`
	Name    string `json:"name"`
	Order   int    `json:"order"`
	AgentId int64  `json:"agentid,omitempty"` //授权方安装的应用agentid。仅旧的第三方多应用套件需要填此参数
}

type MarkTagReq struct {
	Userid         string   `json:"userid"`
	ExternalUserid string   `json:"external_userid"`
	AddTag         []string `json:"add_tag,omitempty"`
	RemoveTag      []string `json:"remove_tag,omitempty"`
}

type TagId struct {
	TagId   []string `json:"tag_id,omitempty"`
	GroupId []string `json:"group_id,omitempty"`
}

type ExternalGroupListReq struct {
	OwnerFilter  OwnerFilter `json:"owner_filter"`
	Cursor       string      `json:"cursor"`
	Limit        int         `json:"limit"`
	StatusFilter int         `json:"status_filter"`
}

type OwnerFilter struct {
	UseridList []string `json:"userid_list"`
}

type GroupChat struct {
	ChatId string `json:"chat_id"`
	Status int    `json:"status"`
}

type GroupChatDetail struct {
	ChatId     string        `json:"chat_id"`
	Name       string        `json:"name"`
	Owner      string        `json:"owner"`
	Notice     string        `json:"notice"`
	CreateTime int64         `json:"create_time"`
	MemberList []GroupMember `json:"member_list"`
	AdminList  []GroupAdmin  `json:"admin_list"`
}

type GroupMember struct {
	Userid        string  `json:"userid"`
	Type          int     `json:"type"`
	JoinScene     int     `json:"join_scene"`
	JoinTime      int64   `json:"join_time"`
	Invitor       Invitor `json:"invitor,omitempty"`
	GroupNickname string  `json:"group_nickname"`
	Name          string  `json:"name"`
	Unionid       string  `json:"unionid,omitempty"`
}

type Invitor struct {
	Userid string `json:"userid"`
}

type GroupAdmin struct {
	Userid string `json:"userid"`
}

type GroupMsgReq struct {
	ChatType   string `json:"chat_type"` //群发任务的类型,默认为single,表示发送给客户,group表示发送给客户群
	Creator    string `json:"creator"`
	Cursor     string `json:"cursor"`
	StartTime  int64  `json:"start_time"`
	EndTime    int64  `json:"end_time"`
	FilterType int    `json:"filter_type"`
	Limit      int    `json:"limit"`
}

type GroupMsg struct {
	MsgId       string       `json:"msgid"`
	Creator     string       `json:"creator"`
	CreateTime  string       `json:"create_time"`
	CreateType  int          `json:"create_type"`
	Text        *ExText      `json:"text,omitempty"`
	Attachments []Attachment `json:"attachments"`
}

type Attachment struct {
	MsgType string     `json:"msgtype"`
	Image   *ExImage   `json:"image,omitempty"`
	Link    *ExLink    `json:"link,omitempty"`
	Program *ExProgram `json:"miniprogram,omitempty"`
	Video   *ExVideo   `json:"video,omitempty"`
	File    *ExFile    `json:"file,omitempty"`
}

type NewExternalUserid struct {
	ExternalUserid    string `json:"external_userid"`
	NewExternalUserid string `json:"new_external_userid"`
}

type RoomInfo struct {
	RoomName       string       `json:"roomname"`
	Creator        string       `json:"creator"`
	Notice         string       `json:"notice"`
	RoomCreateTime int64        `json:"room_create_time"`
	Members        []RoomMember `json:"members"`
}

type RoomMember struct {
	MemberId string `json:"memberid"`
	JoinTime int64  `json:"jointime"`
}

type SingleAgree struct {
	Userid         string `json:"userid"`
	ExternalOpenId string `json:"externalopenid"`
}

type AgreeInfo struct {
	StatusChangeTime int64  `json:"status_change_time"`
	Userid           string `json:"userid"`
	ExternalOpenId   string `json:"externalopenid"`
	AgreeStatus      string `json:"agree_status"`
}

// AgreeNotify 客户同意进行聊天内容存档事件回调
type AgreeNotify struct {
	ToUserName     string `json:"ToUserName" xml:"ToUserName"`
	FromUserName   string `json:"FromUserName" xml:"FromUserName"`
	UserID         string `json:"UserID" xml:"UserID"`
	ExternalUserID string `json:"ExternalUserID" xml:"ExternalUserID"`
	WelcomeCode    string `json:"WelcomeCode" xml:"WelcomeCode"`
}

type AddMomentTask struct {
	Text         ExText       `json:"text"` //不能与Attachment同时为空
	Attachments  []Attachment `json:"attachments"`
	VisibleRange VisibleRange `json:"visible_range"`
}

type VisibleRange struct {
	SenderList struct {
		UserList       []string `json:"user_list"`
		DepartmentList []int    `json:"department_list"`
	} `json:"sender_list"`
	ExternalContactList struct {
		TagList []string `json:"tag_list"`
	} `json:"external_contact_list"`
}

type MomentTaskResult struct {
	Status int    `json:"status"`
	Type   string `json:"type"`
	Result struct {
		ErrCode           int    `json:"errcode"`
		ErrMsg            string `json:"errmsg"`
		MomentId          string `json:"moment_id"`
		InvalidSenderList struct {
			UserList       []string `json:"user_list"`
			DepartmentList []int64  `json:"department_list"`
		} `json:"invalid_sender_list"`
		InvalidExternalContactList struct {
			TagList []string `json:"tag_list"`
		} `json:"invalid_external_contact_list"`
	} `json:"result"`
}

type MomentListReq struct {
	StartTime  int    `json:"start_time"`
	EndTime    int    `json:"end_time"`
	Creator    string `json:"creator"`
	FilterType int    `json:"filter_type"`
	Cursor     string `json:"cursor"`
	Limit      int    `json:"limit"`
}

type MomentListResp struct {
	NextCursor string       `json:"next_cursor"`
	MomentList []MomentInfo `json:"moment_list"`
}

type MomentInfo struct {
	MomentId    string `json:"moment_id"`
	Creator     string `json:"creator"`
	CreateTime  int    `json:"create_time"`
	CreateType  int    `json:"create_type"`
	VisibleType int    `json:"visible_type"`
	Text        struct {
		Content string `json:"content"`
	} `json:"text"`
	Image []struct {
		MediaId string `json:"media_id"`
	} `json:"image"`
	Video struct {
		MediaId      string `json:"media_id"`
		ThumbMediaId string `json:"thumb_media_id"`
	} `json:"video"`
	Link struct {
		Title string `json:"title"`
		Url   string `json:"url"`
	} `json:"link"`
	Location struct {
		Latitude  string `json:"latitude"`
		Longitude string `json:"longitude"`
		Name      string `json:"name"`
	} `json:"location"`
}

type ExternalUserIdInfo struct {
	CorpId         string `json:"corpid"`
	ExternalUserid string `json:"external_userid"`
}

type Export struct {
	EncodingAesKey string `json:"encoding_aeskey"`
	BlockSize      int    `json:"block_size"`
}

type ExportResult struct {
	Status   int          `json:"status"`
	DataList []ExportItem `json:"data_list"`
}

type ExportItem struct {
	Url  string      `json:"url"`
	Size interface{} `json:"size"`
	Md5  string      `json:"md5"`
}

const (
	KEBatchJobResult = "batch_job_result"
)

// ExportNotify 导出任务完成通知
type ExportNotify struct {
	JobId   string `json:"SuiteId" xml:"JobId"`
	JobType string `json:"AuthCorpId" xml:"JobType"` //操作类型,字符串,在异步导出的场景下分别有:export_user(导出成员详情)、 export_simple_user(导出成员)、export_department(导出部门)、export_tag(导出标签成员)
	ErrCode int    `json:"ErrCode" xml:"ErrCode"`
	ErrMsg  string `json:"ErrMsg" xml:"ErrMsg"`
}

type ImportReq struct {
	MediaId  string `json:"media_id"`
	ToInvite bool   `json:"to_invite"`
	Callback struct {
		Url            string `json:"url"`
		Token          string `json:"token"`
		EncodingAesKey string `json:"encodingaeskey"`
	} `json:"callback"`
}

type ImportResult struct {
	Status     int           `json:"status"`
	Type       string        `json:"type"`
	Total      int           `json:"total"`
	Percentage int           `json:"percentage"`
	Result     []interface{} `json:"result"`
}

type MemberAuthResult struct {
	NextCursor     string `json:"next_cursor"`
	MemberAuthList []struct {
		OpenUserid string `json:"open_userid"`
	} `json:"member_auth_list"`
}

type SelectedTicketResult struct {
	OperatorOpenUserid   string   `json:"operator_open_userid"`
	OpenUseridList       []string `json:"open_userid_list"`
	UnAuthOpenUseridList []string `json:"unauth_open_userid_list"`
	Total                int      `json:"total"`
}