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

// CreateDriveComment 在文档中添加一条全局评论, 不支持局部评论。
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/drive-v1/file-comment/create
// new doc: https://open.feishu.cn/document/server-docs/docs/CommentAPI/create
func (r *DriveService) CreateDriveComment(ctx context.Context, request *CreateDriveCommentReq, options ...MethodOptionFunc) (*CreateDriveCommentResp, *Response, error) {
	if r.cli.mock.mockDriveCreateDriveComment != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Drive#CreateDriveComment mock enable")
		return r.cli.mock.mockDriveCreateDriveComment(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Drive",
		API:                   "CreateDriveComment",
		Method:                "POST",
		URL:                   r.cli.openBaseURL + "/open-apis/drive/v1/files/:file_token/comments",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(createDriveCommentResp)

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

// MockDriveCreateDriveComment mock DriveCreateDriveComment method
func (r *Mock) MockDriveCreateDriveComment(f func(ctx context.Context, request *CreateDriveCommentReq, options ...MethodOptionFunc) (*CreateDriveCommentResp, *Response, error)) {
	r.mockDriveCreateDriveComment = f
}

// UnMockDriveCreateDriveComment un-mock DriveCreateDriveComment method
func (r *Mock) UnMockDriveCreateDriveComment() {
	r.mockDriveCreateDriveComment = nil
}

// CreateDriveCommentReq ...
type CreateDriveCommentReq struct {
	FileToken  string                          `path:"file_token" json:"-"`    // 文档 Token, 可以通过浏览器该文档的 URL 栏上直接获取文档 Token, 示例值: "XIHSdYSI7oMEU1xrsnxc8fabcef"
	FileType   FileType                        `query:"file_type" json:"-"`    // 文档类型, 示例值: doc, 可选值有: doc: 文档, docx: 新版文档
	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
	ReplyList  *CreateDriveCommentReqReplyList `json:"reply_list,omitempty"`   // 评论里的回复列表
}

// CreateDriveCommentReqReplyList ...
type CreateDriveCommentReqReplyList struct {
	Replies []*CreateDriveCommentReqReplyListReply `json:"replies,omitempty"` // 回复列表
}

// CreateDriveCommentReqReplyListReply ...
type CreateDriveCommentReqReplyListReply struct {
	Content *CreateDriveCommentReqReplyListReplyContent `json:"content,omitempty"` // 回复内容
}

// CreateDriveCommentReqReplyListReplyContent ...
type CreateDriveCommentReqReplyListReplyContent struct {
	Elements []*CreateDriveCommentReqReplyListReplyContentElement `json:"elements,omitempty"` // 回复内容的元素列表
}

// CreateDriveCommentReqReplyListReplyContentElement ...
type CreateDriveCommentReqReplyListReplyContentElement struct {
	Type     string                                                     `json:"type,omitempty"`      // 回复内容的元素类型, 示例值: "text_run", 可选值有: text_run: 普通文本, docs_link: 云文档链接, person: at 联系人
	TextRun  *CreateDriveCommentReqReplyListReplyContentElementTextRun  `json:"text_run,omitempty"`  // 普通文本
	DocsLink *CreateDriveCommentReqReplyListReplyContentElementDocsLink `json:"docs_link,omitempty"` // 云文档链接
	Person   *CreateDriveCommentReqReplyListReplyContentElementPerson   `json:"person,omitempty"`    // at 联系人
}

// CreateDriveCommentReqReplyListReplyContentElementDocsLink ...
type CreateDriveCommentReqReplyListReplyContentElementDocsLink struct {
	URL string `json:"url,omitempty"` // 添加云文档链接, 示例值: "https://example.feishu.cn/docs/doccnHh7U87HOFpii5u5Gabcef"
}

// CreateDriveCommentReqReplyListReplyContentElementPerson ...
type CreateDriveCommentReqReplyListReplyContentElementPerson struct {
	UserID string `json:"user_id,omitempty"` // 添加用户的 user_id 以@用户, 示例值: "ou_cc19b2bfb93f8a44db4b4d6eababcef"
}

// CreateDriveCommentReqReplyListReplyContentElementTextRun ...
type CreateDriveCommentReqReplyListReplyContentElementTextRun struct {
	Text string `json:"text,omitempty"` // 添加普通文本, 示例值: "comment text"
}

// CreateDriveCommentResp ...
type CreateDriveCommentResp struct {
	CommentID    string                           `json:"comment_id,omitempty"`     // 评论 ID（创建新评论可不填；如填写, 则视为回复已有评论）
	UserID       string                           `json:"user_id,omitempty"`        // 用户 ID
	CreateTime   int64                            `json:"create_time,omitempty"`    // 创建时间
	UpdateTime   int64                            `json:"update_time,omitempty"`    // 更新时间
	IsSolved     bool                             `json:"is_solved,omitempty"`      // 是否已解决
	SolvedTime   int64                            `json:"solved_time,omitempty"`    // 解决评论时间
	SolverUserID string                           `json:"solver_user_id,omitempty"` // 解决评论者的用户 ID
	HasMore      bool                             `json:"has_more,omitempty"`       // 是否还有更多项
	PageToken    string                           `json:"page_token,omitempty"`     // 分页标记, 当 has_more 为 true 时, 会同时返回新的 page_token, 否则不返回 page_token
	IsWhole      bool                             `json:"is_whole,omitempty"`       // 是否是全文评论
	Quote        string                           `json:"quote,omitempty"`          // 局部评论的引用字段
	ReplyList    *CreateDriveCommentRespReplyList `json:"reply_list,omitempty"`     // 评论里的回复列表
}

// CreateDriveCommentRespReplyList ...
type CreateDriveCommentRespReplyList struct {
	Replies []*CreateDriveCommentRespReplyListReply `json:"replies,omitempty"` // 回复列表
}

// CreateDriveCommentRespReplyListReply ...
type CreateDriveCommentRespReplyListReply struct {
	Content    *CreateDriveCommentRespReplyListReplyContent `json:"content,omitempty"`     // 回复内容
	ReplyID    string                                       `json:"reply_id,omitempty"`    // 回复 ID
	UserID     string                                       `json:"user_id,omitempty"`     // 用户 ID
	CreateTime int64                                        `json:"create_time,omitempty"` // 创建时间
	UpdateTime int64                                        `json:"update_time,omitempty"` // 更新时间
	Extra      *CreateDriveCommentRespReplyListReplyExtra   `json:"extra,omitempty"`       // 回复的其他内容, 图片 Token 等
}

// CreateDriveCommentRespReplyListReplyContent ...
type CreateDriveCommentRespReplyListReplyContent struct {
	Elements []*CreateDriveCommentRespReplyListReplyContentElement `json:"elements,omitempty"` // 回复的内容
}

// CreateDriveCommentRespReplyListReplyContentElement ...
type CreateDriveCommentRespReplyListReplyContentElement struct {
	Type     string                                                      `json:"type,omitempty"`      // 回复的内容元素, 可选值有: text_run: 普通文本, docs_link: at 云文档链接, person: at 联系人
	TextRun  *CreateDriveCommentRespReplyListReplyContentElementTextRun  `json:"text_run,omitempty"`  // 文本内容
	DocsLink *CreateDriveCommentRespReplyListReplyContentElementDocsLink `json:"docs_link,omitempty"` // 文本内容
	Person   *CreateDriveCommentRespReplyListReplyContentElementPerson   `json:"person,omitempty"`    // 文本内容
}

// CreateDriveCommentRespReplyListReplyContentElementDocsLink ...
type CreateDriveCommentRespReplyListReplyContentElementDocsLink struct {
	URL string `json:"url,omitempty"` // 回复 at 云文档
}

// CreateDriveCommentRespReplyListReplyContentElementPerson ...
type CreateDriveCommentRespReplyListReplyContentElementPerson struct {
	UserID string `json:"user_id,omitempty"` // 回复 at 联系人
}

// CreateDriveCommentRespReplyListReplyContentElementTextRun ...
type CreateDriveCommentRespReplyListReplyContentElementTextRun struct {
	Text string `json:"text,omitempty"` // 回复 普通文本
}

// CreateDriveCommentRespReplyListReplyExtra ...
type CreateDriveCommentRespReplyListReplyExtra struct {
	ImageList []string `json:"image_list,omitempty"` // 评论中的图片 Token list
}

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