package core

import (
	"github.com/goWxHook/goWxHook/utils/json"
)

type GetFriendListResponse struct {
	Data []GetFriendListResponseDateItem `json:"data"`
	Type int                             `json:"type"`
}
type GetFriendListResponseDateItem struct {
	Account     string `json:"account"`      // 微信账号，友情的直接连线
	Avatar      string `json:"avatar"`       // 头像的风景画，好友的形象代言
	City        string `json:"city"`         // 都市的温馨角落，好友的日常坐标
	Country     string `json:"country"`      // 国界的另一端，好友的远方故事
	LabelidList string `json:"labelid_list"` // 标签的彩虹桥，连接不同朋友圈的密码
	Nickname    string `json:"nickname"`     // 昵称的诗篇，好友的个性签名
	Province    string `json:"province"`     // 省份的风土人情，好友的地域色彩
	Remark      string `json:"remark"`       // 备注的小秘密，只有你知道的代号
	Sex         int    `json:"sex"`          // 性别的罗盘，1为蓝海，2为红颜
	Wxid        string `json:"wxid"`         // 微信ID，好友的唯一坐标
}

// GetFriendList 获取好友列表
func (w *WxApi) GetFriendList() ([]GetFriendListResponseDateItem, error) {
	resp, err := w.internalCall(MtDataFriendsMsg, 10, MtDataFriendsMsg, map[string]interface{}{}, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetFriendListResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

type GetFriendInfoResponse struct {
	Data GetFriendListResponseDateItem `json:"data"`
	Type int                           `json:"type"`
}

// GetFriendInfo 获取单个好友信息
func (w *WxApi) GetFriendInfo(wxid string) (*GetFriendListResponseDateItem, error) {
	resp, err := w.internalCall(MtDataWxidMsg, 10, MtDataWxidMsg, map[string]interface{}{"wxid": wxid}, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetFriendInfoResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type GetFriendBriefInfoByProtocolResponseData struct {
	Account     string `json:"account"`
	Avatar      string `json:"avatar"`
	City        string `json:"city"`
	Country     string `json:"country"`
	Nickname    string `json:"nickname"`
	Province    string `json:"province"`
	Remark      string `json:"remark"`
	Sex         int    `json:"sex"`
	Signature   string `json:"signature"`
	SmallAvatar string `json:"small_avatar"`
	SnsPic      string `json:"sns_pic"`
	SourceType  int    `json:"source_type"`
	Status      int    `json:"status"`
	V1          string `json:"v1"`
	V2          string `json:"v2"`
	Wxid        string `json:"wxid"`
}
type GetFriendBriefInfoByProtocolResponse struct {
	Data GetFriendBriefInfoByProtocolResponseData `json:"data"`
	Type int                                      `json:"type"`
}

// GetFriendBriefInfoByProtocol 获取好友简要信息（协议）
func (w *WxApi) GetFriendBriefInfoByProtocol(wxid string) (*GetFriendBriefInfoByProtocolResponseData, error) {
	resp, err := w.internalCall(MtUpdateWxidMsg, 20, MtUpdateWxidMsg, map[string]interface{}{"wxid": wxid}, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetFriendBriefInfoByProtocolResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type GetFriendDetailInfoByProtocolResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	ContactCount int                                                        `json:"contactCount"`
	ContactList  []GetFriendDetailInfoByProtocolResponseDataContactListItem `json:"contactList"`
	RetList      []struct {
		RetList int `json:"retList"`
	} `json:"retList"`
	VerifyUserValidTicketList []interface{} `json:"verifyUserValidTicketList"`
}

type GetFriendDetailInfoByProtocolResponseDataContactListItem struct {
	AddContactScene       int `json:"addContactScene"`
	AdditionalContactList struct {
		LinkedinContactItem struct {
		} `json:"linkedinContactItem"`
	} `json:"additionalContactList"`
	AlbumBgImgId        string `json:"albumBgImgId"`
	AlbumFlag           int    `json:"albumFlag"`
	AlbumStyle          int    `json:"albumStyle"`
	Alias               string `json:"alias"`
	BigHeadImgUrl       string `json:"bigHeadImgUrl"`
	BitMask             int64  `json:"bitMask"`
	BitVal              int    `json:"bitVal"`
	CardImgUrl          string `json:"cardImgUrl"`
	ChatRoomData        string `json:"chatRoomData"`
	ChatRoomNotify      int    `json:"chatRoomNotify"`
	ChatRoomOwner       string `json:"chatRoomOwner"`
	ChatroomInfoVersion int    `json:"chatroomInfoVersion"`
	ChatroomMaxCount    int    `json:"chatroomMaxCount"`
	ChatroomType        int    `json:"chatroomType"`
	ChatroomVersion     int    `json:"chatroomVersion"`
	City                string `json:"city"`
	ContactType         int    `json:"contactType"`
	Country             string `json:"country"`
	CustomizedInfo      struct {
		BrandFlag    int    `json:"brandFlag"`
		BrandIconURL string `json:"brandIconURL"`
		BrandInfo    string `json:"brandInfo"`
		ExternalInfo string `json:"externalInfo"`
	} `json:"customizedInfo"`
	DeleteFlag  int    `json:"deleteFlag"`
	Description string `json:"description"`
	DomainList  struct {
	} `json:"domainList"`
	EncryptUserName    string `json:"encryptUserName"`
	ExtInfo            string `json:"extInfo"`
	HasWeiXinHdHeadImg int    `json:"hasWeiXinHdHeadImg"`
	HeadImgMd5         string `json:"headImgMd5"`
	IdcardNum          string `json:"idcardNum"`
	ImgBuf             struct {
		Buffer string `json:"buffer"`
		ILen   int    `json:"iLen"`
	} `json:"imgBuf"`
	ImgFlag         int    `json:"imgFlag"`
	LabelIdList     string `json:"labelIdList"`
	Level           int    `json:"level"`
	MobileFullHash  string `json:"mobileFullHash"`
	MobileHash      string `json:"mobileHash"`
	MyBrandList     string `json:"myBrandList"`
	NewChatroomData struct {
		ChatRoomMemberList []interface{} `json:"chatRoomMemberList"`
		InfoMask           int           `json:"infoMask"`
		MemberCount        int           `json:"memberCount"`
	} `json:"newChatroomData"`
	NickName struct {
		String string `json:"string"`
	} `json:"nickName"`
	PersonalCard     int `json:"personalCard"`
	PhoneNumListInfo struct {
		Count        int           `json:"count"`
		PhoneNumList []interface{} `json:"phoneNumList"`
	} `json:"phoneNumListInfo"`
	Province  string `json:"province"`
	PyInitial struct {
		String string `json:"string"`
	} `json:"pyInitial"`
	QuanPin struct {
		String string `json:"string"`
	} `json:"quanPin"`
	RealName string `json:"realName"`
	Remark   struct {
	} `json:"remark"`
	RemarkPYInitial struct {
	} `json:"remarkPYInitial"`
	RemarkQuanPin struct {
	} `json:"remarkQuanPin"`
	RoomInfoCount   int           `json:"roomInfoCount"`
	RoomInfoList    []interface{} `json:"roomInfoList"`
	Sex             int           `json:"sex"`
	Signature       string        `json:"signature"`
	SmallHeadImgUrl string        `json:"smallHeadImgUrl"`
	SnsUserInfo     struct {
		SnsBgImgId    string `json:"snsBgImgId"`
		SnsBgObjectId string `json:"snsBgObjectId"`
		SnsFlag       int    `json:"snsFlag"`
		SnsFlagEx     int    `json:"snsFlagEx"`
	} `json:"snsUserInfo"`
	Source   int `json:"source"`
	UserName struct {
		String string `json:"string"`
	} `json:"userName"`
	VerifyContent string `json:"verifyContent"`
	VerifyFlag    int    `json:"verifyFlag"`
	VerifyInfo    string `json:"verifyInfo"`
	WeiDianInfo   string `json:"weiDianInfo"`
	Weibo         string `json:"weibo"`
	WeiboFlag     int    `json:"weiboFlag"`
	WeiboNickname string `json:"weiboNickname"`
}

type GetFriendDetailInfoByProtocolResponse struct {
	Data GetFriendDetailInfoByProtocolResponseData `json:"data"`
	Type int                                       `json:"type"`
}

// GetFriendDetailInfoByProtocol 获取好友详细信息（协议）
func (w *WxApi) GetFriendDetailInfoByProtocol(wxid string) ([]GetFriendDetailInfoByProtocolResponseDataContactListItem, error) {
	resp, err := w.internalCall(MtGetFriendDetailMsg, 20, MtGetFriendDetailMsg, map[string]interface{}{"wxid": wxid}, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetFriendDetailInfoByProtocolResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}

	return rdata.Data.ContactList, nil
}

// GetFriendDetailInfoListByProtocol 批量获取好友详细信息（协议）
func (w *WxApi) GetFriendDetailInfoListByProtocol(wxids []string) ([]GetFriendDetailInfoByProtocolResponseDataContactListItem, error) {
	resp, err := w.internalCall(MtGetFriendDetailMsg, 20, MtGetFriendDetailMsg, map[string]interface{}{"username_list": wxids}, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetFriendDetailInfoByProtocolResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data.ContactList, nil
}

type EditFriendRemarkRequest struct {
	Wxid   string `json:"wxid"`
	Remark string `json:"remark"`
}

// EditFriendRemark 编辑好友备注
func (w *WxApi) EditFriendRemark(request EditFriendRemarkRequest) (err error) {
	_, err = w.internalCall(0, -1, MtModFriendRemarkMsg, request, nil)
	return err
}

type AddFriendRequest struct {
	Wxid       string `json:"wxid"`
	Remark     string `json:"remark"`
	RoomWxid   string `json:"room_wxid"`
	SourceType int    `json:"source_type"`
}

// AddFriend 发送好友申请
// 参数:
// clientId: 客户端ID，用于标识发起请求的客户端
// wxid: 待添加好友的微信ID
// remark: 对好友的备注信息
// roomWxid: 若是在某个群聊中发起的好友申请，此参数为群聊的微信ID
// sourceType: 好友申请的来源类型，群聊14
func (w *WxApi) AddFriend(request AddFriendRequest) (err error) {
	_, err = w.internalCall(0, -1, MtAddFriendMsg, request, nil)
	return err
}

type AcceptFriendRequest struct {
	Encryptusername string `json:"encryptusername"`
	Ticket          string `json:"ticket"`
	Scene           int    `json:"scene"`
}
type AcceptFriendResponse struct {
	Data WxCommonData `json:"data"`
	Type int          `json:"type"`
}

// AcceptFriend 同意加好友申请
func (w *WxApi) AcceptFriend(request AcceptFriendRequest) *WxCommonData {
	resp, err := w.internalCall(MtAcceptFriendMsg, 30, MtAcceptFriendMsg, request, nil)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	var rdata AcceptFriendResponse
	err = json.Unmarshal([]byte(resp), rdata)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	return &rdata.Data
}

// DelFriend 删除好友
func (w *WxApi) DelFriend(wxid string) (err error) {
	_, err = w.internalCall(0, -1, MtDelFriendMsg, map[string]interface{}{
		"wxid": wxid,
	}, nil)
	return err
}

type SearchWxUserResponseData struct {
	Account     string `json:"account"`
	Avatar      string `json:"avatar"`
	City        string `json:"city"`
	Country     string `json:"country"`
	Keyword     string `json:"keyword"`
	Nickname    string `json:"nickname"`
	Provice     string `json:"provice"`
	Search      string `json:"search"`
	Sex         int    `json:"sex"`
	Signature   string `json:"signature"`
	SmallAvatar string `json:"small_avatar"`
	Status      int    `json:"status"`
	V1          string `json:"v1"`
	V2          string `json:"v2"`
	Wxid        string `json:"wxid"`
}

type SearchWxUserResponse struct {
	Data SearchWxUserResponseData `json:"data"`
	Type int                      `json:"type"`
}

// SearchWxUser 搜索微信用户
func (w *WxApi) SearchWxUser(keyword string) (*SearchWxUserResponseData, error) {
	resp, err := w.internalCall(MtSearchWxUserMsg, 20, MtSearchWxUserMsg, map[string]interface{}{"search": keyword}, nil)
	if err != nil {
		return nil, err
	}
	var rdata SearchWxUserResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type AddSearchWxUserRequest struct {
	V1     string `json:"v1"`
	V2     string `json:"v2"`
	Remark string `json:"remark"`
}

type AddSearchWxUserResponse struct {
	Data WxCommonData `json:"data"`
	Type int          `json:"type"`
}

// AddSearchWxUser 添加搜索用户
func (w *WxApi) AddSearchWxUser(request AddSearchWxUserRequest) *WxCommonData {
	resp, err := w.internalCall(MtAddSearchUserMsg, 30, MtAddSearchUserMsg, request, nil)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	var rdata AddSearchWxUserResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	return &rdata.Data
}

// CheckFriendStatus 检测好友状态（发送无痕清粉消息）
func (w *WxApi) CheckFriendStatus(wxid string) *WxCommonData {
	resp, err := w.internalCall(MtZombieCheckMsg, 10, MtZombieCheckMsg, map[string]interface{}{"wxid": wxid}, nil)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	var rdata WxCommonResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return &WxCommonData{Errcode: -1, Errmsg: err.Error()}
	}
	return &rdata.Data
}

type AutoAcceptAddFriendRequest struct {
	Auto int `json:"auto"` // 1自动同意 0取消自动同意
}

// AutoAcceptAddFriend 自动同意好友申请
func (w *WxApi) AutoAcceptAddFriend(request AutoAcceptAddFriendRequest) (err error) {
	_, err = w.internalCall(0, -1, MtAutoAcceptFriendMsg, request, nil)
	return err
}

type AutoAcceptCardRequest struct {
	Auto int `json:"auto"` // 1自动接收 0取消自动接收
}

// AutoAcceptCard 自动接收名片
func (w *WxApi) AutoAcceptCard(request AutoAcceptCardRequest) error {
	_, err := w.internalCall(0, -1, MtAutoAcceptCardMsg, request, nil)
	return err
}

type AutoAcceptWCPayRequest struct {
	Auto int `json:"auto"` // 1自动接收 0取消自动接收
}

// AutoAcceptWCPay 自动接收好友转账
func (w *WxApi) AutoAcceptWCPay(request AutoAcceptWCPayRequest) error {
	_, err := w.internalCall(0, -1, MtAutoAcceptWcpayMsg, request, nil)
	return err
}

type GetPublicUserListResponse struct {
	Data []GetPublicUserListResponseData `json:"data"`
	Type int                             `json:"type"`
}

type GetPublicUserListResponseData struct {
	Avatar   string `json:"avatar"`
	Nickname string `json:"nickname"`
	Wxid     string `json:"wxid"`
}

func (w *WxApi) GetPublicUserList() ([]GetPublicUserListResponseData, error) {
	resp, err := w.internalCall(MtDataPublicsMsg, 30, MtDataPublicsMsg, nil, map[string]interface{}{})
	if err != nil {
		return nil, err
	}
	var rdata GetPublicUserListResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}
