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

// GetApproval 根据 Approval Code 获取某个审批定义的详情, 用于构造创建审批实例的请求。
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/approval-v4/approval/get
// new doc: https://open.feishu.cn/document/server-docs/approval-v4/approval/get
func (r *ApprovalService) GetApproval(ctx context.Context, request *GetApprovalReq, options ...MethodOptionFunc) (*GetApprovalResp, *Response, error) {
	if r.cli.mock.mockApprovalGetApproval != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Approval#GetApproval mock enable")
		return r.cli.mock.mockApprovalGetApproval(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Approval",
		API:                   "GetApproval",
		Method:                "GET",
		URL:                   r.cli.openBaseURL + "/open-apis/approval/v4/approvals/:approval_code",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
	}
	resp := new(getApprovalResp)

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

// MockApprovalGetApproval mock ApprovalGetApproval method
func (r *Mock) MockApprovalGetApproval(f func(ctx context.Context, request *GetApprovalReq, options ...MethodOptionFunc) (*GetApprovalResp, *Response, error)) {
	r.mockApprovalGetApproval = f
}

// UnMockApprovalGetApproval un-mock ApprovalGetApproval method
func (r *Mock) UnMockApprovalGetApproval() {
	r.mockApprovalGetApproval = nil
}

// GetApprovalReq ...
type GetApprovalReq struct {
	ApprovalCode string  `path:"approval_code" json:"-"`  // 审批定义 Code, 示例值: "7C468A54-8745-2245-9675-08B7C63E7A85"
	Locale       *string `query:"locale" json:"-"`        // 语言可选值, 示例值: zh-CN, 可选值有: zh-CN: 中文, en-US: 英文, ja-JP: 日文
	WithAdminID  *bool   `query:"with_admin_id" json:"-"` // 可选是否返回有数据权限审批流程管理员ID列表, 示例值: false
	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
}

// GetApprovalResp ...
type GetApprovalResp struct {
	ApprovalName     string                   `json:"approval_name,omitempty"`      // 审批名称
	Status           string                   `json:"status,omitempty"`             // 审批定义状态, 可选值有: ACTIVE: 已启用, INACTIVE: 已停用, DELETED: 已删除, UNKNOWN: 未知
	Form             ApprovalWidgetList       `json:"form,omitempty"`               // 控件信息, 见下方form字段说明
	NodeList         []*GetApprovalRespNode   `json:"node_list,omitempty"`          // 节点信息
	Viewers          []*GetApprovalRespViewer `json:"viewers,omitempty"`            // 可见人列表
	ApprovalAdminIDs []string                 `json:"approval_admin_ids,omitempty"` // 有数据管理权限的审批流程管理员ID, 由参数“with_admin_id”控制是否返回
}

// GetApprovalRespNode ...
type GetApprovalRespNode struct {
	Name                string                                    `json:"name,omitempty"`                  // 节点名称
	NeedApprover        bool                                      `json:"need_approver,omitempty"`         // 是否发起人自选节点 true - 发起审批时需要提交审批人
	NodeID              string                                    `json:"node_id,omitempty"`               // 节点 ID
	CustomNodeID        string                                    `json:"custom_node_id,omitempty"`        // 节点自定义 ID, 如果没有设置则不返回
	NodeType            string                                    `json:"node_type,omitempty"`             // 审批方式, 可选值有: AND: 会签, OR: 或签, SEQUENTIAL: 依次审批, CC_NODE: 抄送节点
	ApproverChosenMulti bool                                      `json:"approver_chosen_multi,omitempty"` // 是否支持多选: true-支持, 发起、结束节点该值无意义
	ApproverChosenRange []*GetApprovalRespNodeApproverChosenRange `json:"approver_chosen_range,omitempty"` // 自选范围
	RequireSignature    bool                                      `json:"require_signature,omitempty"`     // 是否签名
}

// GetApprovalRespNodeApproverChosenRange ...
type GetApprovalRespNodeApproverChosenRange struct {
	ApproverRangeType int64    `json:"approver_range_type,omitempty"` // 指定范围: 0-all, 1-指定角色, 2-指定人员, 可选值有: 0: 全公司范围, 1: 指定角色范围, 2: 指定用户范围
	ApproverRangeIDs  []string `json:"approver_range_ids,omitempty"`  // 根据上面的type, 分别存放角色id与人员open_id, type为0时本字段为空列表
}

// GetApprovalRespViewer ...
type GetApprovalRespViewer struct {
	Type   string `json:"type,omitempty"`    // 可见人类型, 可选值有: TENANT: 租户内可见, DEPARTMENT: 指定部门, USER: 指定用户, ROLE: 指定角色, USER_GROUP: 指定用户组, NONE: 任何人都不可见
	ID     string `json:"id,omitempty"`      // 在可见人类型为DEPARTMENT时, id为部门的id ；在可见人类型为USER时, id为用户的id ；在可见人类型为ROLE时, id为角色的id ；在可见人类型为USER_GROUP时, id为用户组的id
	UserID string `json:"user_id,omitempty"` // 在可见人类型为USER时, 表示可见人用户id
}

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