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

// GetUserOKRList 根据用户的 id 获取 OKR 列表。
//
// 使用tenant_access_token需要额外申请权限以应用身份访问OKR信息
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/okr-v1/user-okr/list
// new doc: https://open.feishu.cn/document/server-docs/okr-v1/okr/list
func (r *OKRService) GetUserOKRList(ctx context.Context, request *GetUserOKRListReq, options ...MethodOptionFunc) (*GetUserOKRListResp, *Response, error) {
	if r.cli.mock.mockOKRGetUserOKRList != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] OKR#GetUserOKRList mock enable")
		return r.cli.mock.mockOKRGetUserOKRList(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "OKR",
		API:                   "GetUserOKRList",
		Method:                "GET",
		URL:                   r.cli.openBaseURL + "/open-apis/okr/v1/users/:user_id/okrs",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(getUserOKRListResp)

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

// MockOKRGetUserOKRList mock OKRGetUserOKRList method
func (r *Mock) MockOKRGetUserOKRList(f func(ctx context.Context, request *GetUserOKRListReq, options ...MethodOptionFunc) (*GetUserOKRListResp, *Response, error)) {
	r.mockOKRGetUserOKRList = f
}

// UnMockOKRGetUserOKRList un-mock OKRGetUserOKRList method
func (r *Mock) UnMockOKRGetUserOKRList() {
	r.mockOKRGetUserOKRList = nil
}

// GetUserOKRListReq ...
type GetUserOKRListReq struct {
	UserID     string   `path:"user_id" json:"-"`       // 目标用户id, 示例值: "ou-asdasdasdasdasd"
	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), people_admin_id: 以people_admin_id来识别用户, 默认值: `open_id`, 当值为 `user_id`, 字段权限要求: 获取用户 user ID
	Offset     string   `query:"offset" json:"-"`       // 请求列表的偏移（对应响应体的 okr_list 字段）, offset>=0, 示例值: 0
	Limit      string   `query:"limit" json:"-"`        // 列表长度, 0-10, 示例值: 5
	Lang       *string  `query:"lang" json:"-"`         // 请求OKR的语言版本（比如@的人名）, lang=en_us/zh_cn, 示例值: zh_cn, 默认值: `zh_cn`
	PeriodIDs  []string `query:"period_ids" json:"-"`   // period_id列表, 最多10个, 示例值: 6990181559036610092, 最大长度: `10`
}

// GetUserOKRListResp ...
type GetUserOKRListResp struct {
	Total   int64                    `json:"total,omitempty"`    // OKR周期总数
	OKRList []*GetUserOKRListRespOKR `json:"okr_list,omitempty"` // OKR 列表
}

// GetUserOKRListRespOKR ...
type GetUserOKRListRespOKR struct {
	ID            string                            `json:"id,omitempty"`             // OKR ID
	Permission    int64                             `json:"permission,omitempty"`     // OKR的访问权限, 可选值有: 0: 此时OKR只返回id, 1: 返回OKR的其他具体字段
	PeriodID      string                            `json:"period_id,omitempty"`      // OKR 周期 ID
	Name          string                            `json:"name,omitempty"`           // 名称
	ObjectiveList []*GetUserOKRListRespOKRObjective `json:"objective_list,omitempty"` // Objective列表
	ConfirmStatus int64                             `json:"confirm_status,omitempty"` // OKR确认状态, 可选值有: 0: 初始状态, 1: 待提交/未提交, 2: 待处理/待确认, 3: 已拒绝/已建议, 4: 已通过/已确认
}

// GetUserOKRListRespOKRObjective ...
type GetUserOKRListRespOKRObjective struct {
	ID                                 string                                             `json:"id,omitempty"`                                      // Objective ID
	Permission                         int64                                              `json:"permission,omitempty"`                              // 权限, 可选值有: 0: 此时OKR只返回id, 1: 返回OKR的其他具体字段
	Content                            string                                             `json:"content,omitempty"`                                 // Objective 内容
	ProgressReport                     string                                             `json:"progress_report,omitempty"`                         // Objective 备注内容
	Score                              int64                                              `json:"score,omitempty"`                                   // Objective 分数（0 - 100）
	Weight                             float64                                            `json:"weight,omitempty"`                                  // Objective的权重（0 - 100）
	ProgressRate                       *GetUserOKRListRespOKRObjectiveProgressRate        `json:"progress_rate,omitempty"`                           // Objective进度
	KrList                             []*GetUserOKRListRespOKRObjectiveKr                `json:"kr_list,omitempty"`                                 // Objective KeyResult 列表
	AlignedObjectiveList               []*GetUserOKRListRespOKRObjectiveAlignedObjective  `json:"aligned_objective_list,omitempty"`                  // 对齐到该Objective的Objective列表
	AligningObjectiveList              []*GetUserOKRListRespOKRObjectiveAligningObjective `json:"aligning_objective_list,omitempty"`                 // 该Objective对齐到的Objective列表
	ProgressRecordList                 []*GetUserOKRListRespOKRObjectiveProgressRecord    `json:"progress_record_list,omitempty"`                    // 该Objective的进度列表
	ProgressRatePercentLastUpdatedTime string                                             `json:"progress_rate_percent_last_updated_time,omitempty"` // 最后一次进度百分比更新时间 毫秒
	ProgressRateStatusLastUpdatedTime  string                                             `json:"progress_rate_status_last_updated_time,omitempty"`  // 最后一次状态更新时间 毫秒
	ProgressRecordLastUpdatedTime      string                                             `json:"progress_record_last_updated_time,omitempty"`       // 最后一次在侧边栏新增或者编辑进展的时间 毫秒
	ProgressReportLastUpdatedTime      string                                             `json:"progress_report_last_updated_time,omitempty"`       // 最后一次编辑备注的时间 毫秒
	ScoreLastUpdatedTime               string                                             `json:"score_last_updated_time,omitempty"`                 // 最后一次打分更新时间 毫秒
	Deadline                           string                                             `json:"deadline,omitempty"`                                // 截止时间 毫秒
	MentionedUserList                  []*GetUserOKRListRespOKRObjectiveMentionedUser     `json:"mentioned_user_list,omitempty"`                     // 该Objective提到的人员列表
}

// GetUserOKRListRespOKRObjectiveAlignedObjective ...
type GetUserOKRListRespOKRObjectiveAlignedObjective struct {
	ID    string                                               `json:"id,omitempty"`     // Objective的ID
	OKRID string                                               `json:"okr_id,omitempty"` // OKR的ID
	Owner *GetUserOKRListRespOKRObjectiveAlignedObjectiveOwner `json:"owner,omitempty"`  // 该Objective的Owner
}

// GetUserOKRListRespOKRObjectiveAlignedObjectiveOwner ...
type GetUserOKRListRespOKRObjectiveAlignedObjectiveOwner struct {
	OpenID string `json:"open_id,omitempty"` // 用户的 open_id
	UserID string `json:"user_id,omitempty"` // 用户的 user_id
}

// GetUserOKRListRespOKRObjectiveAligningObjective ...
type GetUserOKRListRespOKRObjectiveAligningObjective struct {
	ID    string                                                `json:"id,omitempty"`     // Objective的ID
	OKRID string                                                `json:"okr_id,omitempty"` // OKR的ID
	Owner *GetUserOKRListRespOKRObjectiveAligningObjectiveOwner `json:"owner,omitempty"`  // 该Objective的Owner
}

// GetUserOKRListRespOKRObjectiveAligningObjectiveOwner ...
type GetUserOKRListRespOKRObjectiveAligningObjectiveOwner struct {
	OpenID string `json:"open_id,omitempty"` // 用户的 open_id
	UserID string `json:"user_id,omitempty"` // 用户的 user_id
}

// GetUserOKRListRespOKRObjectiveKr ...
type GetUserOKRListRespOKRObjectiveKr struct {
	ID                                 string                                            `json:"id,omitempty"`                                      // Key Result ID
	Content                            string                                            `json:"content,omitempty"`                                 // KeyResult 内容
	Score                              int64                                             `json:"score,omitempty"`                                   // KeyResult打分（0 - 100）
	Weight                             int64                                             `json:"weight,omitempty"`                                  // KeyResult权重（0 - 100）（废弃）
	KrWeight                           float64                                           `json:"kr_weight,omitempty"`                               // KeyResult的权重（0 - 100）
	ProgressRate                       *GetUserOKRListRespOKRObjectiveKrProgressRate     `json:"progress_rate,omitempty"`                           // KR进度
	ProgressRecordList                 []*GetUserOKRListRespOKRObjectiveKrProgressRecord `json:"progress_record_list,omitempty"`                    // 该KR的进度列表
	ProgressRatePercentLastUpdatedTime string                                            `json:"progress_rate_percent_last_updated_time,omitempty"` // 最后一次进度百分比更新时间 毫秒
	ProgressRateStatusLastUpdatedTime  string                                            `json:"progress_rate_status_last_updated_time,omitempty"`  // 最后一次状态更新时间 毫秒
	ProgressRecordLastUpdatedTime      string                                            `json:"progress_record_last_updated_time,omitempty"`       // 最后一次在侧边栏新增或者编辑进展的时间 毫秒
	ProgressReportLastUpdatedTime      string                                            `json:"progress_report_last_updated_time,omitempty"`       // 最后一次编辑备注的时间 毫秒
	ScoreLastUpdatedTime               string                                            `json:"score_last_updated_time,omitempty"`                 // 最后一次打分更新时间 毫秒
	Deadline                           string                                            `json:"deadline,omitempty"`                                // 截止时间 毫秒
	MentionedUserList                  []*GetUserOKRListRespOKRObjectiveKrMentionedUser  `json:"mentioned_user_list,omitempty"`                     // 该Objective提到的人员列表
}

// GetUserOKRListRespOKRObjectiveKrMentionedUser ...
type GetUserOKRListRespOKRObjectiveKrMentionedUser struct {
	OpenID string `json:"open_id,omitempty"` // 用户的 open_id
	UserID string `json:"user_id,omitempty"` // 用户的 user_id
}

// GetUserOKRListRespOKRObjectiveKrProgressRate ...
type GetUserOKRListRespOKRObjectiveKrProgressRate struct {
	Percent int64  `json:"percent,omitempty"` // Objective 进度百分比 >= 0
	Status  string `json:"status,omitempty"`  // Objective 进度状态: "-1" 暂无, "0" 正常, "1" 风险, "2" 延期
}

// GetUserOKRListRespOKRObjectiveKrProgressRecord ...
type GetUserOKRListRespOKRObjectiveKrProgressRecord struct {
	ID string `json:"id,omitempty"` // OKR 进展记录ID
}

// GetUserOKRListRespOKRObjectiveMentionedUser ...
type GetUserOKRListRespOKRObjectiveMentionedUser struct {
	OpenID string `json:"open_id,omitempty"` // 用户的 open_id
	UserID string `json:"user_id,omitempty"` // 用户的 user_id
}

// GetUserOKRListRespOKRObjectiveProgressRate ...
type GetUserOKRListRespOKRObjectiveProgressRate struct {
	Percent int64  `json:"percent,omitempty"` // Objective 进度百分比 >= 0
	Status  string `json:"status,omitempty"`  // Objective 进度状态: "-1" 暂无, "0" 正常, "1" 风险, "2" 延期
}

// GetUserOKRListRespOKRObjectiveProgressRecord ...
type GetUserOKRListRespOKRObjectiveProgressRecord struct {
	ID string `json:"id,omitempty"` // OKR 进展记录ID
}

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