package core

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

type AddTagRequest struct {
	LabelName string `json:"label_name"`
}

type AddTagResponseData struct {
	LabelId   int    `json:"label_id"`
	LabelName string `json:"label_name"`
}

type AddTagResponse struct {
	Data AddTagResponseData `json:"data"`
	Type int                `json:"type"`
}

// AddTag 添加标签
func (w *WxApi) AddTag(request AddTagRequest) (*AddTagResponseData, error) {
	resp, err := w.internalCall(MtAddTagMsg, 20, MtAddTagMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata AddTagResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type DeleteTagRequest struct {
	LabelId int `json:"label_id"`
}

type DeleteTagResponseData struct {
	BaseResponse struct {
		ErrMsg struct {
		} `json:"errMsg"`
		Ret int `json:"ret"`
	} `json:"baseResponse"`
}

type DeleteTagResponse struct {
	Data DeleteTagResponseData `json:"data"`
	Type int                   `json:"type"`
}

// DeleteTag 删除标签
func (w *WxApi) DeleteTag(request DeleteTagRequest) (*DeleteTagResponseData, error) {
	resp, err := w.internalCall(MtDeleteTagMsg, 20, MtDeleteTagMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata DeleteTagResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type ModifyTagRequest struct {
	LabelId   int    `json:"label_id"`
	LabelName string `json:"label_name"`
}

// ModifyTag 修改标签
func (w *WxApi) ModifyTag(request ModifyTagRequest) error {
	_, err := w.internalCall(MtModifyTagMsg, 20, MtModifyTagMsg, request, nil)
	return err
}

type AddTagToUserRequest struct {
	Wxid        string `json:"wxid"`
	LabelidList string `json:"labelid_list"`
}

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

type AddTagToUserResponse struct {
	Data AddTagToUserResponseData `json:"data"`
	Type int                      `json:"type"`
}

// AddTagToUser 为用户添加标签
func (w *WxApi) AddTagToUser(request AddTagToUserRequest) (*AddTagToUserResponseData, error) {
	resp, err := w.internalCall(MtAddTagToUserMsg, 20, MtAddTagToUserMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata AddTagToUserResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type GetTagListByWxidRequest struct {
	Wxid string `json:"wxid"`
}

type GetTagListByWxidResponseData struct {
	LabelidList string `json:"labelid_list"`
	Wxid        string `json:"wxid"`
}

type GetTagListByWxidResponse struct {
	Data GetTagListByWxidResponseData `json:"data"`
	Type int                          `json:"type"`
}

// GetTagListByWxid 获取用户标签列表
func (w *WxApi) GetTagListByWxid(request GetTagListByWxidRequest) (*GetTagListByWxidResponseData, error) {
	resp, err := w.internalCall(MtGetTagListByWxidMsg, 20, MtGetTagListByWxidMsg, request, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetTagListByWxidResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return &rdata.Data, nil
}

type GetTagListResponseDataItem struct {
	LabelId   string `json:"label_id"`
	LabelName string `json:"label_name"`
}

type GetTagListResponse struct {
	Data []GetTagListResponseDataItem `json:"data"`
	Type int                          `json:"type"`
}

// GetTagList 获取标签列表
func (w *WxApi) GetTagList() ([]GetTagListResponseDataItem, error) {
	resp, err := w.internalCall(MtGetTagListMsg, 20, MtGetTagListMsg, nil, nil)
	if err != nil {
		return nil, err
	}
	var rdata GetTagListResponse
	err = json.Unmarshal([]byte(resp), &rdata)
	if err != nil {
		return nil, WxError{-1, err.Error()}
	}
	return rdata.Data, nil
}
