// 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"
)

// CreateDocxBlock 指定需要操作的块, 为其创建一批子块, 并插入到指定位置。如果操作成功, 接口将返回新创建子块的富文本内容。
//
// 在调用此接口前, 请仔细阅读[新版文档 OpenAPI 接口校验规则](https://bytedance.feishu.cn/docx/doxcnby5Y0yoACL3PdfZqrJEm6f#doxcnm0ooUe0s20GwwVB3a05rtb), 了解相关规则及约束。
// 应用频率限制: 单个应用调用频率上限为每秒 3 次, 超过该频率限制, 接口将返回 HTTP 状态码 400 及错误码 99991400；
// 文档频率限制: 单篇文档并发编辑上限为每秒 3 次, 超过该频率限制, 接口将返回 HTTP 状态码 429, 编辑操作包括:
// - 创建块
// - 删除块
// - 更新块
// - 批量更新块
// 当请求被限频, 应用需要处理限频状态码, 并使用指数退避算法或其它一些频控策略降低对 API 的调用速率。
//
// doc: https://open.feishu.cn/document/ukTMukTMukTM/uUDN04SN0QjL1QDN/document-docx/docx-v1/document-block-children/create
// new doc: https://open.feishu.cn/document/server-docs/docs/docs/docx-v1/document-block/create
func (r *DriveService) CreateDocxBlock(ctx context.Context, request *CreateDocxBlockReq, options ...MethodOptionFunc) (*CreateDocxBlockResp, *Response, error) {
	if r.cli.mock.mockDriveCreateDocxBlock != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Drive#CreateDocxBlock mock enable")
		return r.cli.mock.mockDriveCreateDocxBlock(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Drive",
		API:                   "CreateDocxBlock",
		Method:                "POST",
		URL:                   r.cli.openBaseURL + "/open-apis/docx/v1/documents/:document_id/blocks/:block_id/children",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(createDocxBlockResp)

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

// MockDriveCreateDocxBlock mock DriveCreateDocxBlock method
func (r *Mock) MockDriveCreateDocxBlock(f func(ctx context.Context, request *CreateDocxBlockReq, options ...MethodOptionFunc) (*CreateDocxBlockResp, *Response, error)) {
	r.mockDriveCreateDocxBlock = f
}

// UnMockDriveCreateDocxBlock un-mock DriveCreateDocxBlock method
func (r *Mock) UnMockDriveCreateDocxBlock() {
	r.mockDriveCreateDocxBlock = nil
}

// CreateDocxBlockReq ...
type CreateDocxBlockReq struct {
	DocumentID         string       `path:"document_id" json:"-"`           // 文档的唯一标识。对应新版文档 Token, [点击了解如何获取云文档 Token](https://open.feishu.cn/document/ukTMukTMukTM/uczNzUjL3czM14yN3MTN#08bb5df6), 示例值: "doxcnePuYufKa49ISjhD8Ih0ikh"
	BlockID            string       `path:"block_id" json:"-"`              // 父块的`block_id`, 表示为其创建一批子块。如果需要对文档树根节点创建子块, 可将`document_id`填入此处, 示例值: "doxcnO6UW6wAw2qIcYf4hZpFIth"
	DocumentRevisionID *int64       `query:"document_revision_id" json:"-"` // 操作的文档版本, 1 表示文档最新版本。若此时操作的版本为文档最新版本, 则需要持有文档的阅读权限；若此时操作的版本为文档的历史版本, 则需要持有文档的编辑权限, 示例值:1, 默认值: `-1`, 最小值: `-1`
	ClientToken        *string      `query:"client_token" json:"-"`         // 操作的唯一标识, 与接口返回值的 client_token 相对应, 用于幂等的进行更新操作。此值为空表示将发起一次新的请求, 此值非空表示幂等的进行更新操作, 示例值: "fe599b60-450f-46ff-b2ef-9f6675625b97"
	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
	Children           []*DocxBlock `json:"children,omitempty"`             // 添加的孩子列表, 长度范围: `1` ～ `50`
	Index              *int64       `json:"index,omitempty"`                // 当前 block 在 children 中的插入位置, 起始值为 0, 最大值为原 children 长度, 示例值: 0, 默认值: `-1`
}

// CreateDocxBlockResp ...
type CreateDocxBlockResp struct {
	Children           []*DocxBlock `json:"children,omitempty"`             // 所添加的孩子的 Block 信息
	DocumentRevisionID int64        `json:"document_revision_id,omitempty"` // 当前 block children 创建成功后文档的版本号
	ClientToken        string       `json:"client_token,omitempty"`         // 操作的唯一标识, 更新请求中使用此值表示幂等的进行此次更新
}

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