// Code generated by lark_sdk_gen. DO NOT EDIT.
/**
 * Copyright 2022 chyroc
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package lark

import (
	"context"
)

// UpdateAppFeedCardButton 为群组消息、机器人消息的消息流卡片添加、更新、删除快捷操作按钮。
//
// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/group/im-v2/chat_button/update
func (r *MessageService) UpdateAppFeedCardButton(ctx context.Context, request *UpdateAppFeedCardButtonReq, options ...MethodOptionFunc) (*UpdateAppFeedCardButtonResp, *Response, error) {
	if r.cli.mock.mockMessageUpdateAppFeedCardButton != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Message#UpdateAppFeedCardButton mock enable")
		return r.cli.mock.mockMessageUpdateAppFeedCardButton(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Message",
		API:                   "UpdateAppFeedCardButton",
		Method:                "PUT",
		URL:                   r.cli.openBaseURL + "/open-apis/im/v2/chat_button",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
	}
	resp := new(updateAppFeedCardButtonResp)

	response, err := r.cli.RawRequest(ctx, req, resp)
	return resp.Data, response, err
}

// MockMessageUpdateAppFeedCardButton mock MessageUpdateAppFeedCardButton method
func (r *Mock) MockMessageUpdateAppFeedCardButton(f func(ctx context.Context, request *UpdateAppFeedCardButtonReq, options ...MethodOptionFunc) (*UpdateAppFeedCardButtonResp, *Response, error)) {
	r.mockMessageUpdateAppFeedCardButton = f
}

// UnMockMessageUpdateAppFeedCardButton un-mock MessageUpdateAppFeedCardButton method
func (r *Mock) UnMockMessageUpdateAppFeedCardButton() {
	r.mockMessageUpdateAppFeedCardButton = nil
}

// UpdateAppFeedCardButtonReq ...
type UpdateAppFeedCardButtonReq struct {
	UserIDType *IDType                            `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: open_id, 可选值有: open_id: 标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。[了解更多: 如何获取 Open ID](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-openid), union_id: 标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的, 在不同开发商下的应用中的 Union ID 是不同的。通过 Union ID, 应用开发商可以把同个用户在多个应用中的身份关联起来。[了解更多: 如何获取 Union ID？](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-union-id), user_id: 标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内, 一个用户的 User ID 在所有应用（包括商店应用）中都保持一致。User ID 主要用于在不同的应用间打通用户数据。[了解更多: 如何获取 User ID？](https://open.feishu.cn/document/uAjLw4CM/ugTN1YjL4UTN24CO1UjN/trouble-shooting/how-to-obtain-user-id), 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID
	UserIDs    []string                           `json:"user_ids,omitempty"`     // 用户 ID 列表, 示例值: ["ou_89553eda9014c201e6969b478895c276"], 长度范围: `1` ～ `20`
	ChatID     string                             `json:"chat_id,omitempty"`      // 群 ID, 示例值: "oc_a0553eda9014c201e6969b478895c230"
	Buttons    *UpdateAppFeedCardButtonReqButtons `json:"buttons,omitempty"`      // 按钮
}

// UpdateAppFeedCardButtonReqButtons ...
type UpdateAppFeedCardButtonReqButtons struct {
	Buttons []*UpdateAppFeedCardButtonReqButtonsButton `json:"buttons,omitempty"` // 按钮组合, 该字段为全量更新字段, 若未传入字段原有值, 则会清空字段数据。例如: 在保持原有按钮的字段配置的前提下, 新增一个按钮配置会添加一个按钮, 在原有按钮的字段配置上做更新, 会更新该按钮, 清空原有按钮的字段配置, 会删除该按钮, 长度范围: `0` ～ `2`
}

// UpdateAppFeedCardButtonReqButtonsButton ...
type UpdateAppFeedCardButtonReqButtonsButton struct {
	MultiURL   *UpdateAppFeedCardButtonReqButtonsButtonMultiURL `json:"multi_url,omitempty"`   // 跳转 URL
	ActionType string                                           `json:"action_type,omitempty"` // 交互类型, 示例值: "url_page", 可选值有: url_page: URL 页面, webhook: 回调
	Text       *UpdateAppFeedCardButtonReqButtonsButtonText     `json:"text,omitempty"`        // 文字
	ButtonType *string                                          `json:"button_type,omitempty"` // 按钮类型, 示例值: "default", 可选值有: default: 默认, primary: 主要, success: 成功, 默认值: `default`
	ActionMap  map[string]string                                `json:"action_map,omitempty"`  // action 字典, 示例值: {"foo": "bar"}
}

// UpdateAppFeedCardButtonReqButtonsButtonMultiURL ...
type UpdateAppFeedCardButtonReqButtonsButtonMultiURL struct {
	URL        *string `json:"url,omitempty"`         // 默认 URL, 示例值: "https://www.feishu.cn/", 最大长度: `700` 字符
	AndroidURL *string `json:"android_url,omitempty"` // Android 平台 URL, 示例值: "https://www.feishu.cn/", 最大长度: `700` 字符
	IosURL     *string `json:"ios_url,omitempty"`     // iOS 平台 URL, 示例值: "https://www.feishu.cn/", 最大长度: `700` 字符
	PcURL      *string `json:"pc_url,omitempty"`      // PC URL, 示例值: "https://www.feishu.cn/", 最大长度: `700` 字符
}

// UpdateAppFeedCardButtonReqButtonsButtonText ...
type UpdateAppFeedCardButtonReqButtonsButtonText struct {
	Text string `json:"text,omitempty"` // 文本, 示例值: "文本", 长度范围: `1` ～ `30` 字符
}

// UpdateAppFeedCardButtonResp ...
type UpdateAppFeedCardButtonResp struct {
	FailedUserReasons []*UpdateAppFeedCardButtonRespFailedUserReason `json:"failed_user_reasons,omitempty"` // 失败的用户
}

// UpdateAppFeedCardButtonRespFailedUserReason ...
type UpdateAppFeedCardButtonRespFailedUserReason struct {
	ErrorCode    int64  `json:"error_code,omitempty"`    // 错误码
	ErrorMessage string `json:"error_message,omitempty"` // 错误信息
	UserID       string `json:"user_id,omitempty"`       // 用户id
}

// updateAppFeedCardButtonResp ...
type updateAppFeedCardButtonResp struct {
	Code  int64                        `json:"code,omitempty"` // 错误码, 非 0 表示失败
	Msg   string                       `json:"msg,omitempty"`  // 错误描述
	Data  *UpdateAppFeedCardButtonResp `json:"data,omitempty"`
	Error *ErrorDetail                 `json:"error,omitempty"`
}
