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

// GetCalendarEvent 调用该接口以当前身份（应用或用户）获取指定日历内的某一日程信息, 包括日程的标题、时间段、视频会议信息、公开范围以及参与人权限等。
//
// - 当前身份由 Header Authorization 的 Token 类型决定。tenant_access_token 指应用身份, user_access_token 指用户身份。
// - 当前身份必须对日历有 reader、writer 或 owner 权限。你可以调用[查询日历信息](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar/get)接口, 获取当前身份对该日历的访问权限。
// - 你可以通过 event_id 的时间戳后缀来获取例外日程的时间信息。例如, event_id 为 `xxxxxxxxx_1602504000` 的例外日程时间戳为 160250400。关于例外日程说明可参见[日程资源介绍](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/introduction)。
//
// doc: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/get
// new doc: https://open.feishu.cn/document/server-docs/calendar-v4/calendar-event/get
func (r *CalendarService) GetCalendarEvent(ctx context.Context, request *GetCalendarEventReq, options ...MethodOptionFunc) (*GetCalendarEventResp, *Response, error) {
	if r.cli.mock.mockCalendarGetCalendarEvent != nil {
		r.cli.Log(ctx, LogLevelDebug, "[lark] Calendar#GetCalendarEvent mock enable")
		return r.cli.mock.mockCalendarGetCalendarEvent(ctx, request, options...)
	}

	req := &RawRequestReq{
		Scope:                 "Calendar",
		API:                   "GetCalendarEvent",
		Method:                "GET",
		URL:                   r.cli.openBaseURL + "/open-apis/calendar/v4/calendars/:calendar_id/events/:event_id",
		Body:                  request,
		MethodOption:          newMethodOption(options),
		NeedTenantAccessToken: true,
		NeedUserAccessToken:   true,
	}
	resp := new(getCalendarEventResp)

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

// MockCalendarGetCalendarEvent mock CalendarGetCalendarEvent method
func (r *Mock) MockCalendarGetCalendarEvent(f func(ctx context.Context, request *GetCalendarEventReq, options ...MethodOptionFunc) (*GetCalendarEventResp, *Response, error)) {
	r.mockCalendarGetCalendarEvent = f
}

// UnMockCalendarGetCalendarEvent un-mock CalendarGetCalendarEvent method
func (r *Mock) UnMockCalendarGetCalendarEvent() {
	r.mockCalendarGetCalendarEvent = nil
}

// GetCalendarEventReq ...
type GetCalendarEventReq struct {
	CalendarID          string  `path:"calendar_id" json:"-"`            // 日程所在的日历 ID。关于日历 ID 可参见[日历 ID 说明](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar/introduction), 示例值: "feishu.cn_xxxxxxxxxx@group.calendar.feishu.cn"
	EventID             string  `path:"event_id" json:"-"`               // 日程 ID, 创建日程时会返回日程 ID。你也可以调用以下接口获取某一日历的 ID, [获取日程列表](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/list), [搜索日程](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/search), 示例值: "xxxxxxxxx_0"
	NeedMeetingSettings *bool   `query:"need_meeting_settings" json:"-"` // 是否需要返回飞书视频会议（VC）的会前设置。需满足以下条件才可以获取到返回结果: 日程的会议类型（vc_type）需要是 vc, 需要有日程的编辑权限, 可选值有: true: 需要, false（默认值）: 不需要, 示例值: false
	NeedAttendee        *bool   `query:"need_attendee" json:"-"`         // 是否需要返回参与人信息, 可选值有: true: 需要, false（默认值）: 不需要, 示例值: false
	MaxAttendeeNum      *int64  `query:"max_attendee_num" json:"-"`      // 返回的最大参与人数量。调用[获取日程参与人列表](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event-attendee/list)可获取日程完整的参与人信息, 示例值: 10, 默认值: `10`, 最大值: `100`
	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
}

// GetCalendarEventResp ...
type GetCalendarEventResp struct {
	Event *GetCalendarEventRespEvent `json:"event,omitempty"` // 日程的详细信息。
}

// GetCalendarEventRespEvent ...
type GetCalendarEventRespEvent struct {
	EventID             string                                   `json:"event_id,omitempty"`              // 日程 ID。后续可通过该 ID 查询、更新或删除日程信息。更多信息可参见[日程 ID 说明](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/introduction)。
	OrganizerCalendarID string                                   `json:"organizer_calendar_id,omitempty"` // 日程组织者的日历 ID。关于日历 ID 可参见[日历 ID 说明](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar/introduction)。
	Summary             string                                   `json:"summary,omitempty"`               // 日程标题。
	Description         string                                   `json:"description,omitempty"`           // 日程描述。
	StartTime           *GetCalendarEventRespEventStartTime      `json:"start_time,omitempty"`            // 日程开始时间。
	EndTime             *GetCalendarEventRespEventEndTime        `json:"end_time,omitempty"`              // 日程结束时间。
	Vchat               *GetCalendarEventRespEventVchat          `json:"vchat,omitempty"`                 // 视频会议信息。
	Visibility          string                                   `json:"visibility,omitempty"`            // 日程公开范围。仅新建日程时对所有参与人生效, 之后修改该属性仅对当前身份生效, 可选值有: default: 默认权限, 跟随日历权限, 即默认仅向他人显示是否忙碌, public: 公开, 显示日程详情, private: 私密, 仅自己可见详情
	AttendeeAbility     string                                   `json:"attendee_ability,omitempty"`      // 参与人权限, 可选值有: none: 无法编辑日程、无法邀请其它参与人、无法查看参与人列表, can_see_others: 无法编辑日程、无法邀请其它参与人、可以查看参与人列表, can_invite_others: 无法编辑日程、可以邀请其它参与人、可以查看参与人列表, can_modify_event: 可以编辑日程、可以邀请其它参与人、可以查看参与人列表
	FreeBusyStatus      string                                   `json:"free_busy_status,omitempty"`      // 日程占用的忙闲状态。仅新建日程时对所有参与人生效, 之后修改该属性仅对当前身份生效, 可选值有: busy: 忙碌, free: 空闲
	Location            *GetCalendarEventRespEventLocation       `json:"location,omitempty"`              // 日程地点。
	Color               int64                                    `json:"color,omitempty"`                 // 日程颜色, 由颜色 RGB 值的 int32 表示, 说明: 仅对当前身份生效, 取值为 0 或 -1 时, 表示默认跟随日历颜色, 客户端展示时会映射到色板上最接近的一种颜色。
	Reminders           []*GetCalendarEventRespEventReminder     `json:"reminders,omitempty"`             // 日程提醒列表。
	Recurrence          string                                   `json:"recurrence,omitempty"`            // 重复日程的重复性规则, 规则格式可参见 [rfc5545](https://datatracker.ietf.org/doc/html/rfc5545#section-3.3.10)。
	Status              string                                   `json:"status,omitempty"`                // 日程状态, 可选值有: tentative: 未回应, confirmed: 已确认, cancelled: 日程已取消
	IsException         bool                                     `json:"is_exception,omitempty"`          // 日程是否是一个重复日程的例外日程。了解例外日程, 可参见[例外日程](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/calendar-v4/calendar-event/introduction#71c5ec78)。
	RecurringEventID    string                                   `json:"recurring_event_id,omitempty"`    // 例外日程对应的原重复日程的 event_id。
	CreateTime          string                                   `json:"create_time,omitempty"`           // 日程的创建时间（秒级时间戳）。
	Schemas             []*GetCalendarEventRespEventSchema       `json:"schemas,omitempty"`               // 日程自定义信息, 控制日程详情页的 UI 展示。
	EventOrganizer      *GetCalendarEventRespEventEventOrganizer `json:"event_organizer,omitempty"`       // 日程组织者信息。
	AppLink             string                                   `json:"app_link,omitempty"`              // 日程的 app_link, 跳转到具体的某个日程。
	Attendees           []*GetCalendarEventRespEventAttendee     `json:"attendees,omitempty"`             // 日程参与人信息。
	HasMoreAttendee     bool                                     `json:"has_more_attendee,omitempty"`     // 是否有更多的参与人。
	Attachments         []*GetCalendarEventRespEventAttachment   `json:"attachments,omitempty"`           // 日程附件
}

// GetCalendarEventRespEventAttachment ...
type GetCalendarEventRespEventAttachment struct {
	FileToken string `json:"file_token,omitempty"` // 附件token
	FileSize  string `json:"file_size,omitempty"`  // 附件大小
	Name      string `json:"name,omitempty"`       // 附件名称
}

// GetCalendarEventRespEventAttendee ...
type GetCalendarEventRespEventAttendee struct {
	Type                  CalendarEventAttendeeType                                 `json:"type,omitempty"`                   // 参与人类型, 可选值有: user: 用户, chat: 群组, resource: 会议室, third_party: 邮箱
	AttendeeID            string                                                    `json:"attendee_id,omitempty"`            // 参与人 ID, 日程参与人在当前日程内的唯一标识。
	RsvpStatus            string                                                    `json:"rsvp_status,omitempty"`            // 参与人 RSVP 状态, 即日程回复状态, 可选值有: needs_action: 参与人尚未回复状态, 或表示会议室预约中, accept: 参与人回复接受, 或表示会议室预约成功, tentative: 参与人回复待定, decline: 参与人回复拒绝, 或表示会议室预约失败, removed: 参与人或会议室已经从日程中被移除
	IsOptional            bool                                                      `json:"is_optional,omitempty"`            // 参与人是否为可选参加, 该参数值对群组的群成员不生效。
	IsOrganizer           bool                                                      `json:"is_organizer,omitempty"`           // 参与人是否为日程组织者。
	IsExternal            bool                                                      `json:"is_external,omitempty"`            // 参与人是否为外部参与人。外部参与人不支持编辑。
	DisplayName           string                                                    `json:"display_name,omitempty"`           // 参与人名称。
	ChatMembers           []*GetCalendarEventRespEventAttendeeChatMember            `json:"chat_members,omitempty"`           // 群中的群成员, 当参与人类型（type）为 chat 时有效。群成员不支持编辑。
	UserID                string                                                    `json:"user_id,omitempty"`                // 用户类型参与人的用户 ID, ID 类型与 user_id_type 的值保持一致。关于用户 ID 可参见[用户相关的 ID 概念](https://open.feishu.cn/document/home/user-identity-introduction/introduction), 注意: 当 is_external 返回为 true 时, 此字段只会返回 open_id 或者 union_id。
	ChatID                string                                                    `json:"chat_id,omitempty"`                // 群组类型参与人的群组 ID。关于群组 ID 可参见[群 ID 说明](https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-id-description)。
	RoomID                string                                                    `json:"room_id,omitempty"`                // 会议室类型参与人的会议室 ID。
	ThirdPartyEmail       string                                                    `json:"third_party_email,omitempty"`      // 外部邮箱类型参与人的邮箱地址。
	OperateID             string                                                    `json:"operate_id,omitempty"`             // 如果日程是使用应用身份创建的, 在添加会议室时, 指定的会议室联系人 ID。ID 类型与 user_id_type 的值保持一致。
	ResourceCustomization []*GetCalendarEventRespEventAttendeeResourceCustomization `json:"resource_customization,omitempty"` // 会议室的个性化配置。
}

// GetCalendarEventRespEventAttendeeChatMember ...
type GetCalendarEventRespEventAttendeeChatMember struct {
	RsvpStatus  string `json:"rsvp_status,omitempty"`  // 参与人 RSVP 状态, 即日程回复状态, 可选值有: needs_action: 参与人尚未回复状态, 或表示会议室预约中, accept: 参与人回复接受, 或表示会议室预约成功, tentative: 参与人回复待定, decline: 参与人回复拒绝, 或表示会议室预约失败, removed: 参与人或会议室已经从日程中被移除
	IsOptional  bool   `json:"is_optional,omitempty"`  // 参与人是否为可选参加。
	DisplayName string `json:"display_name,omitempty"` // 参与人名称。
	IsOrganizer bool   `json:"is_organizer,omitempty"` // 参与人是否为日程组织者。
	IsExternal  bool   `json:"is_external,omitempty"`  // 参与人是否为外部参与人。
}

// GetCalendarEventRespEventAttendeeResourceCustomization ...
type GetCalendarEventRespEventAttendeeResourceCustomization struct {
	IndexKey     string                                                          `json:"index_key,omitempty"`     // 每个配置的唯一 ID。
	InputContent string                                                          `json:"input_content,omitempty"` // 填空类型的取值。
	Options      []*GetCalendarEventRespEventAttendeeResourceCustomizationOption `json:"options,omitempty"`       // 每个配置的选项。
}

// GetCalendarEventRespEventAttendeeResourceCustomizationOption ...
type GetCalendarEventRespEventAttendeeResourceCustomizationOption struct {
	OptionKey     string `json:"option_key,omitempty"`     // 每个选项的唯一 ID。
	OthersContent string `json:"others_content,omitempty"` // 其他选项类型的取值。
}

// GetCalendarEventRespEventEndTime ...
type GetCalendarEventRespEventEndTime struct {
	Date      string `json:"date,omitempty"`      // 结束时间, 仅全天日程使用该字段, [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) 格式, 例如, 2018-09-01。
	Timestamp string `json:"timestamp,omitempty"` // 秒级时间戳, 指日程具体的结束时间。例如, 1602504000 表示 2020/10/12 20:00:00（UTC +8 时区）。
	Timezone  string `json:"timezone,omitempty"`  // 时区。使用 IANA Time Zone Database 标准。
}

// GetCalendarEventRespEventEventOrganizer ...
type GetCalendarEventRespEventEventOrganizer struct {
	UserID      string `json:"user_id,omitempty"`      // 日程组织者 user ID。
	DisplayName string `json:"display_name,omitempty"` // 日程组织者姓名。
}

// GetCalendarEventRespEventLocation ...
type GetCalendarEventRespEventLocation struct {
	Name      string  `json:"name,omitempty"`      // 地点名称。
	Address   string  `json:"address,omitempty"`   // 地点地址。
	Latitude  float64 `json:"latitude,omitempty"`  // 地点坐标纬度信息, 对于国内的地点, 采用 GCJ-02 标准, 对于海外的地点, 采用 WGS84 标准
	Longitude float64 `json:"longitude,omitempty"` // 地点坐标经度信息, 对于国内的地点, 采用 GCJ-02 标准, 对于海外的地点, 采用 WGS84 标准
}

// GetCalendarEventRespEventReminder ...
type GetCalendarEventRespEventReminder struct {
	Minutes int64 `json:"minutes,omitempty"` // 日程提醒时间的偏移量。该参数仅对当前身份生效, 正数时表示在日程开始前 X 分钟提醒, 负数时表示在日程开始后 X 分钟提醒。
}

// GetCalendarEventRespEventSchema ...
type GetCalendarEventRespEventSchema struct {
	UiName   string `json:"ui_name,omitempty"`   // UI 名称。可能值: ForwardIcon: 日程转发按钮, MeetingChatIcon: 会议群聊按钮, MeetingMinutesIcon: 会议纪要按钮, MeetingVideo: 视频会议区域, RSVP: 接受、拒绝、待定区域, Attendee: 参与者区域, OrganizerOrCreator: 组织者或创建者区域
	UiStatus string `json:"ui_status,omitempty"` // UI 项自定义状态, 可选值有: hide: 隐藏显示, readonly: 只读, editable: 可编辑, unknown: 未知 UI 项自定义状态, 仅用于读取时兼容
	AppLink  string `json:"app_link,omitempty"`  // 按钮点击后跳转的链接。
}

// GetCalendarEventRespEventStartTime ...
type GetCalendarEventRespEventStartTime struct {
	Date      string `json:"date,omitempty"`      // 开始时间, 仅全天日程使用该字段, [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) 格式, 例如, 2018-09-01。
	Timestamp string `json:"timestamp,omitempty"` // 秒级时间戳, 指日程具体的开始时间。例如, 1602504000 表示 2020/10/12 20:00:00（UTC +8 时区）。
	Timezone  string `json:"timezone,omitempty"`  // 时区。使用 IANA Time Zone Database 标准。
}

// GetCalendarEventRespEventVchat ...
type GetCalendarEventRespEventVchat struct {
	VCType          string                                         `json:"vc_type,omitempty"`          // 视频会议类型, 可以为空, 表示在首次添加日程参与人时, 会自动生成飞书视频会议 URL, 可选值有: vc: 飞书视频会议。取该类型时, vchat 内的其他字段无效。, third_party: 第三方链接视频会议。取该类型时, vchat 内仅生效 icon_type、description、meeting_url 字段。, no_meeting: 无视频会议。取该类型时, vchat 内的其他字段无效。, lark_live: 飞书直播, 只读参数。, unknown: 未知类型, 用于兼容的只读参数。
	IconType        string                                         `json:"icon_type,omitempty"`        // 第三方视频会议 icon 类型, 可以为空, 表示展示默认 icon, 可选值有: vc: 飞书视频会议 icon。, live: 直播视频会议 icon。, default: 默认 icon。
	Description     string                                         `json:"description,omitempty"`      // 第三方视频会议文案。
	MeetingURL      string                                         `json:"meeting_url,omitempty"`      // 视频会议 URL。
	MeetingSettings *GetCalendarEventRespEventVchatMeetingSettings `json:"meeting_settings,omitempty"` // 飞书视频会议（VC）的会前设置。
}

// GetCalendarEventRespEventVchatMeetingSettings ...
type GetCalendarEventRespEventVchatMeetingSettings struct {
	OwnerID               string   `json:"owner_id,omitempty"`                // 会议 owner 的用户 ID 信息。
	JoinMeetingPermission string   `json:"join_meeting_permission,omitempty"` // 设置入会范围, 可选值有: anyone_can_join: 所有人可以加入会议。, only_organization_employees: 仅企业内用户可以加入会议, only_event_attendees: 仅日程参与者可以加入会议
	Password              string   `json:"password,omitempty"`                // （灰度中, 仅部分租户可见）设置会议密码, 仅支持 4-9 位数字
	AssignHosts           []string `json:"assign_hosts,omitempty"`            // 主持人的用户 ID 信息。
	AutoRecord            bool     `json:"auto_record,omitempty"`             // 是否开启自动录制。
	OpenLobby             bool     `json:"open_lobby,omitempty"`              // 是否开启等候室。
	AllowAttendeesStart   bool     `json:"allow_attendees_start,omitempty"`   // 是否允许日程参与者发起会议。
}

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