package core

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

type VideoMomentInitResponseData struct {
	AliasInfo []struct {
		AliasMsgName string `json:"aliasMsgName"`
		AliasVersion int    `json:"aliasVersion"`
		HeadImgUrl   string `json:"headImgUrl"`
		Nickname     string `json:"nickname"`
		RoleType     int    `json:"roleType"`
	} `json:"aliasInfo"`
	BaseResponse struct {
		ErrMsg struct {
			String string `json:"string"`
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	Cmdlist              []interface{} `json:"cmdlist"`
	ContinueFlag         int           `json:"continueFlag"`
	CurrentAliasRoleType int           `json:"currentAliasRoleType"`
	FinderUsernameList   []struct {
		FinderUsernameList string `json:"finderUsernameList"`
	} `json:"finderUsernameList"`
	Keybuf struct {
		Buffer string `json:"buffer"`
		ILen   int    `json:"iLen"`
	} `json:"keybuf"`
	Myacct []struct {
		ArchievementInfo struct {
		} `json:"archievementInfo"`
		AuthInfo struct {
		} `json:"authInfo"`
		BindInfo          []interface{} `json:"bindInfo"`
		CoverEntranceFlag int           `json:"coverEntranceFlag"`
		CoverImgUrl       string        `json:"coverImgUrl"`
		CoverUrl          string        `json:"coverUrl"`
		ExtFlag           int           `json:"extFlag"`
		ExtInfo           struct {
			BirthDay   int    `json:"birthDay"`
			BirthMonth int    `json:"birthMonth"`
			BirthYear  int    `json:"birthYear"`
			City       string `json:"city"`
			Country    string `json:"country"`
			Province   string `json:"province"`
			Sex        int    `json:"sex"`
		} `json:"extInfo"`
		FansCount         int `json:"fansCount"`
		FeedCount         int `json:"feedCount"`
		FollowFlag        int `json:"followFlag"`
		FollowTime        int `json:"followTime"`
		ForeignUserFlag   int `json:"foreignUserFlag"`
		FriendFollowCount int `json:"friendFollowCount"`
		GuestInfo         struct {
		} `json:"guestInfo"`
		HeadUrl         string `json:"headUrl"`
		LiveCoverImgUrl string `json:"liveCoverImgUrl"`
		LiveInfo        struct {
			AnchorStatusFlag string `json:"anchorStatusFlag"`
			LotterySetting   struct {
			} `json:"lotterySetting"`
			MicSetting struct {
				SettingFlag       string `json:"settingFlag"`
				SettingSwitchFlag string `json:"settingSwitchFlag"`
			} `json:"micSetting"`
			SwitchFlag int `json:"switchFlag"`
		} `json:"liveInfo"`
		LiveNoticeInfo struct {
		} `json:"liveNoticeInfo"`
		LiveStatus        int           `json:"liveStatus"`
		LoggingoutWording string        `json:"loggingoutWording"`
		Menu              []interface{} `json:"menu"`
		MsgInfo           struct {
		} `json:"msgInfo"`
		Nickname             string `json:"nickname"`
		OneTimeFlag          int    `json:"oneTimeFlag"`
		OriginalEntranceFlag int    `json:"originalEntranceFlag"`
		OriginalFlag         int    `json:"originalFlag"`
		OriginalInfo         struct {
			PostNeedCheckFlag      int `json:"postNeedCheckFlag"`
			PunishYearFlag         int `json:"punishYearFlag"`
			RestApplyOriginalCount int `json:"restApplyOriginalCount"`
			RestPunishDay          int `json:"restPunishDay"`
			RestRepostCount        int `json:"restRepostCount"`
		} `json:"originalInfo"`
		Seq          string `json:"seq"`
		Signature    string `json:"signature"`
		SpamStatus   int    `json:"spamStatus"`
		UserFlag     int    `json:"userFlag"`
		UserMode     int    `json:"userMode"`
		Username     string `json:"username"`
		VestNickname string `json:"vestNickname"`
		WxUsernameV5 string `json:"wxUsernameV5"`
	} `json:"myacct"`
	NextAliasModAvailableTime string `json:"nextAliasModAvailableTime"`
	RetryDelaySecond          int    `json:"retryDelaySecond"`
	RingtoneConfig            struct {
	} `json:"ringtoneConfig"`
	SlideUpGuideConfig []interface{} `json:"slideUpGuideConfig"`
	TabInfos           []struct {
		DisplayTabType int    `json:"displayTabType"`
		TabName        string `json:"tabName"`
	} `json:"tabInfos"`
	TeenmodeSetting struct {
	} `json:"teenmodeSetting"`
	TeenmodeTipsConfig struct {
	} `json:"teenmodeTipsConfig"`
	UserNotCreatedFlag    int `json:"userNotCreatedFlag"`
	Userver               int `json:"userver"`
	UserverForH5          int `json:"userverForH5"`
	WxPersonalizedSetting struct {
	} `json:"wxPersonalizedSetting"`
	WxUserAttr struct {
		NotAvailableFlag int    `json:"notAvailableFlag"`
		Wording          string `json:"wording"`
	} `json:"wxUserAttr"`
	WxUsernameForH5 string `json:"wxUsernameForH5"`
}

type VideoMomentInitResponse struct {
	Data VideoMomentInitResponseData `json:"data"`
	Type int                         `json:"type"`
}

// VideoMomentInit 视频号初始化
func (w *WxApi) VideoMomentInit() (*VideoMomentInitResponseData, error) {
	resp, err := w.internalCall(MtVideoMomentInitMsg, 120, MtVideoMomentInitMsg, nil, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentInitResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type VideoMomentSearchRequest struct {
	Query    string `json:"query"`
	LastBuff string `json:"last_buff"`
	Scene    int    `json:"scene"`
}

type VideoMomentSearchResponse struct {
	Data interface{} `json:"data"`
	Type int         `json:"type"`
}

// VideoMomentSearch 视频号搜索
func (w *WxApi) VideoMomentSearch(request VideoMomentSearchRequest) (interface{}, error) {
	resp, err := w.internalCall(MtVideoMomentSearchMsg, 120, MtVideoMomentSearchMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentSearchResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

type VideoMomentUserHomeRequest struct {
	Username string `json:"username"`
	LastBuff string `json:"last_buff"`
}

type VideoMomentUserHomeResponse struct {
	Data interface{} `json:"data"`
	Type int         `json:"type"`
}

// VideoMomentUserHome 视频号用户主页
func (w *WxApi) VideoMomentUserHome(request VideoMomentUserHomeRequest) (interface{}, error) {
	resp, err := w.internalCall(MtVideoMomentUserHomeMsg, 120, MtVideoMomentUserHomeMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentUserHomeResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

type VideoMomentVideoDetailRequest struct {
	ObjectId      string `json:"object_id"`
	ObjectNonceId string `json:"object_nonce_id"`
	LastBuff      string `json:"last_buff"`
}

type VideoMomentVideoDetailResponse struct {
	Data interface{} `json:"data"`
	Type int         `json:"type"`
}

// VideoMomentVideoDetail 查看视频详细信息(包含评论)
func (w *WxApi) VideoMomentVideoDetail(request VideoMomentVideoDetailRequest) (interface{}, error) {
	resp, err := w.internalCall(MtVideoMomentVideoDetailMsg, 120, MtVideoMomentVideoDetailMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentVideoDetailResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

type VideoMomentFollowRequest struct {
	Username string `json:"username"`
}

type VideoMomentFollowResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
			String string `json:"string"`
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	Contact struct {
		ArchievementInfo struct {
		} `json:"archievementInfo"`
		AuthInfo struct {
			AppName       string `json:"appName"`
			AuthGuarantor struct {
			} `json:"authGuarantor"`
			AuthIconType       int    `json:"authIconType"`
			AuthIconUrl        string `json:"authIconUrl"`
			AuthProfession     string `json:"authProfession"`
			AuthVerifyIdentity int    `json:"authVerifyIdentity"`
			CustomerType       int    `json:"customerType"`
			DetailLink         string `json:"detailLink"`
			RealName           string `json:"realName"`
			VerifyStatus       int    `json:"verifyStatus"`
		} `json:"authInfo"`
		BindInfo          []interface{} `json:"bindInfo"`
		CoverEntranceFlag int           `json:"coverEntranceFlag"`
		CoverImgUrl       string        `json:"coverImgUrl"`
		CoverUrl          string        `json:"coverUrl"`
		ExtFlag           int           `json:"extFlag"`
		ExtInfo           struct {
			BirthDay   int    `json:"birthDay"`
			BirthMonth int    `json:"birthMonth"`
			BirthYear  int    `json:"birthYear"`
			City       string `json:"city"`
			Country    string `json:"country"`
			Province   string `json:"province"`
			Sex        int    `json:"sex"`
		} `json:"extInfo"`
		FansCount         int `json:"fansCount"`
		FeedCount         int `json:"feedCount"`
		FollowFlag        int `json:"followFlag"`
		FollowTime        int `json:"followTime"`
		ForeignUserFlag   int `json:"foreignUserFlag"`
		FriendFollowCount int `json:"friendFollowCount"`
		GuestInfo         struct {
		} `json:"guestInfo"`
		HeadUrl         string `json:"headUrl"`
		LiveCoverImgUrl string `json:"liveCoverImgUrl"`
		LiveInfo        struct {
			AnchorStatusFlag string `json:"anchorStatusFlag"`
			LotterySetting   struct {
				AttendType  int    `json:"attendType"`
				SettingFlag string `json:"settingFlag"`
			} `json:"lotterySetting"`
			MicSetting struct {
				SettingFlag       string `json:"settingFlag"`
				SettingSwitchFlag string `json:"settingSwitchFlag"`
			} `json:"micSetting"`
			SwitchFlag int `json:"switchFlag"`
		} `json:"liveInfo"`
		LiveNoticeInfo struct {
		} `json:"liveNoticeInfo"`
		LiveStatus        int           `json:"liveStatus"`
		LoggingoutWording string        `json:"loggingoutWording"`
		Menu              []interface{} `json:"menu"`
		MsgInfo           struct {
		} `json:"msgInfo"`
		Nickname             string `json:"nickname"`
		OneTimeFlag          int    `json:"oneTimeFlag"`
		OriginalEntranceFlag int    `json:"originalEntranceFlag"`
		OriginalFlag         int    `json:"originalFlag"`
		OriginalInfo         struct {
		} `json:"originalInfo"`
		Seq          int    `json:"seq"`
		Signature    string `json:"signature"`
		SpamStatus   int    `json:"spamStatus"`
		UserFlag     int    `json:"userFlag"`
		UserMode     int    `json:"userMode"`
		Username     string `json:"username"`
		VestNickname string `json:"vestNickname"`
		WxUsernameV5 string `json:"wxUsernameV5"`
	} `json:"contact"`
	LiveStatusFlag int `json:"liveStatusFlag"`
}

type VideoMomentFollowResponse struct {
	Data VideoMomentFollowResponseData `json:"data"`
	Type int                           `json:"type"`
}

// VideoMomentFollow 关注视频号
func (w *WxApi) VideoMomentFollow(request VideoMomentFollowRequest) (*VideoMomentFollowResponseData, error) {
	resp, err := w.internalCall(MtVideoMomentFollowMsg, 120, MtVideoMomentFollowMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentFollowResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type VideoMomentLikeRequest struct {
	ObjectId      string `json:"object_id"`
	ObjectNonceId string `json:"object_nonce_id"`
}

type VideoMomentLikeResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
			String string `json:"string"`
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	Likeid int `json:"likeid"`
}

type VideoMomentLikeResponse struct {
	Data VideoMomentLikeResponseData `json:"data"`
	Type int                         `json:"type"`
}

// VideoMomentLike 视频号点赞
func (w *WxApi) VideoMomentLike(request VideoMomentLikeRequest) (*VideoMomentLikeResponseData, error) {
	resp, err := w.internalCall(MtVideoMomentLikeMsg, 120, MtVideoMomentLikeMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentLikeResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type VideoMomentGetSessionIdRequest struct {
	ToUsername string `json:"to_username"`
	RoleType   int    `json:"roleType"`
}

type VideoMomentGetSessionIdResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	EnableAction int    `json:"enableAction"`
	SessionId    string `json:"sessionId"`
	SessionInfo  struct {
		EnableAction int    `json:"enableAction"`
		MsgExtInfo   string `json:"msgExtInfo"`
		RejectMsg    int    `json:"rejectMsg"`
		SessionId    string `json:"sessionId"`
		ToUsername   string `json:"toUsername"`
	} `json:"sessionInfo"`
	ToUsername string `json:"toUsername"`
}

type VideoMomentGetSessionIdResponse struct {
	Data VideoMomentGetSessionIdResponseData `json:"data"`
	Type int                                 `json:"type"`
}

// VideoMomentGetSessionId 获取私信sessionId
func (w *WxApi) VideoMomentGetSessionId(request VideoMomentGetSessionIdRequest) (*VideoMomentGetSessionIdResponseData, error) {
	resp, err := w.internalCall(MtVideoMomentGetSessionIdMsg, 120, MtVideoMomentGetSessionIdMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentGetSessionIdResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type VideoMomentSendMsgRequest struct {
	ToUsername string `json:"to_username"`
	SessionId  string `json:"session_id"`
	Content    string `json:"content"`
}

type VideoMomentSendMsgResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
			String string `json:"string"`
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
	Newmsgid int `json:"newmsgid"`
}

type VideoMomentSendMsgResponse struct {
	Data VideoMomentSendMsgResponseData `json:"data"`
	Type int                            `json:"type"`
}

// VideoMomentSendMsg 发送私信消息
func (w *WxApi) VideoMomentSendMsg(request VideoMomentSendMsgRequest) (*VideoMomentSendMsgResponseData, error) {
	resp, err := w.internalCall(MtVideoMomentSendMsg, 120, MtVideoMomentSendMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentSendMsgResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type VideoMomentCreateVirtualNickNameRequest struct {
	Nickname   string `json:"nickname"`
	HeadimgUrl string `json:"headimg_url"`
}

type VideoMomentCreateVirtualNickNameResponse struct {
	Data interface{} `json:"data"`
	Type int         `json:"type"`
}

// VideoMomentCreateVirtualNickName 创建虚拟昵称
func (w *WxApi) VideoMomentCreateVirtualNickName(request VideoMomentCreateVirtualNickNameRequest) (interface{}, error) {
	resp, err := w.internalCall(MtVideoMomentCreateVirtualNickNameMsg, 120, MtVideoMomentCreateVirtualNickNameMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentCreateVirtualNickNameResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

type VideoMomentSwitchVirtualNickNameRequest struct {
	RoleType int `json:"role_type"`
}

type VideoMomentSwitchVirtualNickNameResponse struct {
	Data interface{} `json:"data"`
	Type int         `json:"type"`
}

// VideoMomentSwitchVirtualNickName 切换虚拟昵称
func (w *WxApi) VideoMomentSwitchVirtualNickName(request VideoMomentSwitchVirtualNickNameRequest) (interface{}, error) {
	resp, err := w.internalCall(MtVideoMomentSwitchVirtualNickNameMsg, 120, MtVideoMomentSwitchVirtualNickNameMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata VideoMomentSwitchVirtualNickNameResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}

// VideoMomentDeleteVirtualNickName 删除虚拟昵称
func (w *WxApi) VideoMomentDeleteVirtualNickName() error {
	_, err := w.internalCall(0, -1, MtVideoMomentDeleteVirtualNickNameMsg, map[string]interface{}{}, nil)
	if err != nil {
		return err
	}
	return nil
}
