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

// GetHelpdeskTicket 该接口用于获取单个服务台工单详情。仅支持自建应用。
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/helpdesk-v1/ticket/get
// new doc: https://open.feishu.cn/document/server-docs/helpdesk-v1/ticket-management/ticket/get
func (r *HelpdeskService) GetHelpdeskTicket(ctx context.Context, request *GetHelpdeskTicketReq, options ...MethodOptionFunc) (*GetHelpdeskTicketResp, *Response, error) {
	if r.cli.mock.mockHelpdeskGetHelpdeskTicket != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Helpdesk#GetHelpdeskTicket mock enable")
		return r.cli.mock.mockHelpdeskGetHelpdeskTicket(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Helpdesk",
		API:                   "GetHelpdeskTicket",
		Method:                "GET",
		URL:                   r.cli.openBaseURL + "/open-apis/helpdesk/v1/tickets/:ticket_id",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedHelpdeskAuth:      true,
	}
	resp := new(getHelpdeskTicketResp)

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

// MockHelpdeskGetHelpdeskTicket mock HelpdeskGetHelpdeskTicket method
func (r *Mock) MockHelpdeskGetHelpdeskTicket(f func(ctx context.Context, request *GetHelpdeskTicketReq, options ...MethodOptionFunc) (*GetHelpdeskTicketResp, *Response, error)) {
	r.mockHelpdeskGetHelpdeskTicket = f
}

// UnMockHelpdeskGetHelpdeskTicket un-mock HelpdeskGetHelpdeskTicket method
func (r *Mock) UnMockHelpdeskGetHelpdeskTicket() {
	r.mockHelpdeskGetHelpdeskTicket = nil
}

// GetHelpdeskTicketReq ...
type GetHelpdeskTicketReq struct {
	TicketID string `path:"ticket_id" json:"-"` // ticket id, 示例值: "123456"
}

// GetHelpdeskTicketResp ...
type GetHelpdeskTicketResp struct {
	Ticket *GetHelpdeskTicketRespTicket `json:"ticket,omitempty"` // 工单详情
}

// GetHelpdeskTicketRespTicket ...
type GetHelpdeskTicketRespTicket struct {
	TicketID                   string                                            `json:"ticket_id,omitempty"`                     // 工单ID, [可以从工单列表里面取](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/helpdesk-v1/ticket/list), [也可以订阅工单创建事件获取](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/helpdesk-v1/ticket/events/created)
	HelpdeskID                 string                                            `json:"helpdesk_id,omitempty"`                   // 服务台ID
	Guest                      *GetHelpdeskTicketRespTicketGuest                 `json:"guest,omitempty"`                         // 工单创建用户
	Comments                   *GetHelpdeskTicketRespTicketComments              `json:"comments,omitempty"`                      // 备注
	TicketType                 int64                                             `json:"ticket_type,omitempty"`                   // 工单阶段: 1. 机器人 2. 人工
	Status                     int64                                             `json:"status,omitempty"`                        // 工单状态, 1: 已创建 2: 处理中 3: 排队中 4: 待定 5: 待用户响应 50: 被机器人关闭 51: 被客服关闭 52: 用户自己关闭
	Score                      int64                                             `json:"score,omitempty"`                         // 工单评分, 1: 不满意, 2:一般, 3:满意
	CreatedAt                  int64                                             `json:"created_at,omitempty"`                    // 工单创建时间
	UpdatedAt                  int64                                             `json:"updated_at,omitempty"`                    // 工单更新时间, 没有值时为-1
	ClosedAt                   int64                                             `json:"closed_at,omitempty"`                     // 工单结束时间
	DissatisfactionReason      *GetHelpdeskTicketRespTicketDissatisfactionReason `json:"dissatisfaction_reason,omitempty"`        // 不满意原因
	Agents                     []*GetHelpdeskTicketRespTicketAgent               `json:"agents,omitempty"`                        // 工单客服
	Channel                    int64                                             `json:"channel,omitempty"`                       // 工单渠道, 描述: 9: Open API 2: 二维码 14: 分享 13: 搜索 其他数字: 其他渠道
	Solve                      int64                                             `json:"solve,omitempty"`                         // 工单是否解决 1:没解决 2:已解决
	ClosedBy                   *GetHelpdeskTicketRespTicketClosedBy              `json:"closed_by,omitempty"`                     // 关单用户ID
	Collaborators              []*GetHelpdeskTicketRespTicketCollaborator        `json:"collaborators,omitempty"`                 // 工单协作者
	CustomizedFields           []*GetHelpdeskTicketRespTicketCustomizedField     `json:"customized_fields,omitempty"`             // 自定义字段列表, 没有值时不设置, 下拉菜单的value对应工单字段里面的children.display_name, [获取全部工单自定义字段](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/helpdesk-v1/ticket_customized_field/list-ticket-customized-fields)
	AgentServiceDuration       float64                                           `json:"agent_service_duration,omitempty"`        // 客服服务时长, 客服最后一次回复时间距离客服进入时间间隔, 单位分钟
	AgentFirstResponseDuration int64                                             `json:"agent_first_response_duration,omitempty"` // 客服首次回复时间距离客服进入时间的间隔(秒)
	BotServiceDuration         int64                                             `json:"bot_service_duration,omitempty"`          // 机器人服务时间: 客服进入时间距离工单创建时间的间隔, 单位秒
	AgentResolutionTime        int64                                             `json:"agent_resolution_time,omitempty"`         // 客服解决时长, 关单时间距离客服进入时间的间隔, 单位秒
	ActualProcessingTime       int64                                             `json:"actual_processing_time,omitempty"`        // 工单实际处理时间: 从客服进入到关单, 单位秒
	AgentEntryTime             int64                                             `json:"agent_entry_time,omitempty"`              // 客服进入时间, 单位毫秒
	AgentFirstResponseTime     int64                                             `json:"agent_first_response_time,omitempty"`     // 客服首次回复时间, 单位毫秒
	AgentLastResponseTime      int64                                             `json:"agent_last_response_time,omitempty"`      // 客服最后回复时间, 单位毫秒
	AgentOwner                 *GetHelpdeskTicketRespTicketAgentOwner            `json:"agent_owner,omitempty"`                   // 主责客服
}

// GetHelpdeskTicketRespTicketAgent ...
type GetHelpdeskTicketRespTicketAgent struct {
	ID         string `json:"id,omitempty"`         // 用户ID
	AvatarURL  string `json:"avatar_url,omitempty"` // 用户头像url
	Name       string `json:"name,omitempty"`       // 用户名
	Email      string `json:"email,omitempty"`      // 用户邮箱
	Department string `json:"department,omitempty"` // 所在部门名称
	City       string `json:"city,omitempty"`       // 城市
	Country    string `json:"country,omitempty"`    // 国家代号(CountryCode), 参考: http://www.mamicode.com/info-detail-2186501.html
}

// GetHelpdeskTicketRespTicketAgentOwner ...
type GetHelpdeskTicketRespTicketAgentOwner struct {
	ID         string `json:"id,omitempty"`         // 用户ID
	AvatarURL  string `json:"avatar_url,omitempty"` // 用户头像url
	Name       string `json:"name,omitempty"`       // 用户名
	Email      string `json:"email,omitempty"`      // 用户邮箱
	Department string `json:"department,omitempty"` // 所在部门名称
	City       string `json:"city,omitempty"`       // 城市
	Country    string `json:"country,omitempty"`    // 国家代号(CountryCode), 参考: http://www.mamicode.com/info-detail-2186501.html
}

// GetHelpdeskTicketRespTicketClosedBy ...
type GetHelpdeskTicketRespTicketClosedBy struct {
	ID         string `json:"id,omitempty"`         // 用户ID
	AvatarURL  string `json:"avatar_url,omitempty"` // 用户头像url
	Name       string `json:"name,omitempty"`       // 用户名
	Email      string `json:"email,omitempty"`      // 用户邮箱
	Department string `json:"department,omitempty"` // 所在部门名称
	City       string `json:"city,omitempty"`       // 城市
	Country    string `json:"country,omitempty"`    // 国家代号(CountryCode), 参考: http://www.mamicode.com/info-detail-2186501.html
}

// GetHelpdeskTicketRespTicketCollaborator ...
type GetHelpdeskTicketRespTicketCollaborator struct {
	ID         string `json:"id,omitempty"`         // 用户ID
	AvatarURL  string `json:"avatar_url,omitempty"` // 用户头像url
	Name       string `json:"name,omitempty"`       // 用户名
	Email      string `json:"email,omitempty"`      // 用户邮箱
	Department string `json:"department,omitempty"` // 所在部门名称
	City       string `json:"city,omitempty"`       // 城市
	Country    string `json:"country,omitempty"`    // 国家代号(CountryCode), 参考: http://www.mamicode.com/info-detail-2186501.html
}

// GetHelpdeskTicketRespTicketComments ...
type GetHelpdeskTicketRespTicketComments struct {
	Content       string `json:"content,omitempty"`         // 备注
	CreatedAt     int64  `json:"created_at,omitempty"`      // 备注时间, 单位毫秒
	ID            int64  `json:"id,omitempty"`              // 备注ID
	UserAvatarURL string `json:"user_avatar_url,omitempty"` // 备注人头像
	UserName      string `json:"user_name,omitempty"`       // 备注人姓名
	UserID        int64  `json:"user_id,omitempty"`         // 备注人ID
}

// GetHelpdeskTicketRespTicketCustomizedField ...
type GetHelpdeskTicketRespTicketCustomizedField struct {
	ID          string `json:"id,omitempty"`           // 自定义字段ID
	Value       string `json:"value,omitempty"`        // 自定义字段值
	KeyName     string `json:"key_name,omitempty"`     // 键名
	DisplayName string `json:"display_name,omitempty"` // 展示名称
	Position    int64  `json:"position,omitempty"`     // 展示位置
	Required    bool   `json:"required,omitempty"`     // 是否必填
	Editable    bool   `json:"editable,omitempty"`     // 是否可修改
}

// GetHelpdeskTicketRespTicketDissatisfactionReason ...
type GetHelpdeskTicketRespTicketDissatisfactionReason struct {
	ZhCn string `json:"zh_cn,omitempty"` // 中文描述
	EnUs string `json:"en_us,omitempty"` // 英文描述
	JaJp string `json:"ja_jp,omitempty"` // 日文描述
}

// GetHelpdeskTicketRespTicketGuest ...
type GetHelpdeskTicketRespTicketGuest struct {
	ID         string `json:"id,omitempty"`         // 用户ID
	AvatarURL  string `json:"avatar_url,omitempty"` // 用户头像url
	Name       string `json:"name,omitempty"`       // 用户名
	Email      string `json:"email,omitempty"`      // 用户邮箱
	Department string `json:"department,omitempty"` // 所在部门名称
	City       string `json:"city,omitempty"`       // 城市
	Country    string `json:"country,omitempty"`    // 国家代号(CountryCode), 参考: http://www.mamicode.com/info-detail-2186501.html
}

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