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

// CreateTaskTasklist 创建一个清单。清单可以用于组织和管理属于同一个项目的多个任务。
//
// 创建时, 必须填写清单的名字。同时, 可以设置通过`members`字段设置清单的协作成员。关于member的格式, 详见[功能概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/task-v2/overview)中的“ 如何表示任务和清单的成员？”章节。
// 创建清单后, 创建人自动成为清单的所有者。如果请求同时将创建人设置为可编辑/可阅读角色, 则最终该用户成为清单所有者, 并自动从清单成员列表中消失。因为同一个用户在同一个清单只能拥有一个角色。
//
// doc: https://open.larkoffice.com/document/uAjLw4CM/ukTMukTMukTM/task-v2/tasklist/create
func (r *TaskService) CreateTaskTasklist(ctx context.Context, request *CreateTaskTasklistReq, options ...MethodOptionFunc) (*CreateTaskTasklistResp, *Response, error) {
	if r.cli.mock.mockTaskCreateTaskTasklist != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Task#CreateTaskTasklist mock enable")
		return r.cli.mock.mockTaskCreateTaskTasklist(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Task",
		API:                   "CreateTaskTasklist",
		Method:                "POST",
		URL:                   r.cli.openBaseURL + "/open-apis/task/v2/tasklists",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(createTaskTasklistResp)

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

// MockTaskCreateTaskTasklist mock TaskCreateTaskTasklist method
func (r *Mock) MockTaskCreateTaskTasklist(f func(ctx context.Context, request *CreateTaskTasklistReq, options ...MethodOptionFunc) (*CreateTaskTasklistResp, *Response, error)) {
	r.mockTaskCreateTaskTasklist = f
}

// UnMockTaskCreateTaskTasklist un-mock TaskCreateTaskTasklist method
func (r *Mock) UnMockTaskCreateTaskTasklist() {
	r.mockTaskCreateTaskTasklist = nil
}

// CreateTaskTasklistReq ...
type CreateTaskTasklistReq struct {
	UserIDType *IDType                        `query:"user_id_type" json:"-"` // 用户 ID 类型, 示例值: open_id, 默认值: `open_id`
	Name       string                         `json:"name,omitempty"`         // 清单名称, 必填。最多100个字符, 示例值: "年会工作任务清单"
	Members    []*CreateTaskTasklistReqMember `json:"members,omitempty"`      // 清单的成员列表。关于member的格式, 详见[功能概述](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/task-v2/overview)中的“ 如何表示任务和清单的成员？”章节, 最大长度: `500`
}

// CreateTaskTasklistReqMember ...
type CreateTaskTasklistReqMember struct {
	ID   *string `json:"id,omitempty"`   // 表示member的id, 示例值: "ou_2cefb2f014f8d0c6c2d2eb7bafb0e54f", 最大长度: `100` 字符
	Type *string `json:"type,omitempty"` // 成员的类型, 支持: user: 普通用户, 此时member的id是一个表示用户的ID, 比如open_id。具体格式取决于user_id_type参数, chat: 群组, 此时member的id是一个Open Chat ID, app: 应用, 此时member的id是一个应用的ID, 示例值: "user", 默认值: `user`
	Role *string `json:"role,omitempty"` // 成员角色, 可以是"editor"(可编辑）或者"viewer"（可阅读）。默认为"viewer", 示例值: "editor", 最大长度: `20` 字符
}

// CreateTaskTasklistResp ...
type CreateTaskTasklistResp struct {
	Tasklist *CreateTaskTasklistRespTasklist `json:"tasklist,omitempty"` // 创建的清单数据
}

// CreateTaskTasklistRespTasklist ...
type CreateTaskTasklistRespTasklist struct {
	Guid      string                                  `json:"guid,omitempty"`       // 清单的全局唯一ID
	Name      string                                  `json:"name,omitempty"`       // 清单名
	Creator   *CreateTaskTasklistRespTasklistCreator  `json:"creator,omitempty"`    // 清单创建者
	Owner     *CreateTaskTasklistRespTasklistOwner    `json:"owner,omitempty"`      // 清单所有者
	Members   []*CreateTaskTasklistRespTasklistMember `json:"members,omitempty"`    // 清单成员
	URL       string                                  `json:"url,omitempty"`        // 该清单分享的applink
	CreatedAt string                                  `json:"created_at,omitempty"` // 清单创建时间戳(ms)
	UpdatedAt string                                  `json:"updated_at,omitempty"` // 清单最后一次更新时间戳（ms)
}

// CreateTaskTasklistRespTasklistCreator ...
type CreateTaskTasklistRespTasklistCreator struct {
	ID   string `json:"id,omitempty"`   // 表示member的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员角色
}

// CreateTaskTasklistRespTasklistMember ...
type CreateTaskTasklistRespTasklistMember struct {
	ID   string `json:"id,omitempty"`   // 表示member的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员角色
}

// CreateTaskTasklistRespTasklistOwner ...
type CreateTaskTasklistRespTasklistOwner struct {
	ID   string `json:"id,omitempty"`   // 表示member的id
	Type string `json:"type,omitempty"` // 成员的类型
	Role string `json:"role,omitempty"` // 成员角色
}

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