// Package gen provides primitives to interact with the openapi HTTP API.
//
// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.7.1 DO NOT EDIT.
package gen

import (
	"time"

	openapi_types "github.com/oapi-codegen/runtime/types"
)

const (
	BearerAuthScopes bearerAuthContextKey = "bearerAuth.Scopes"
)

// Defines values for ConnectCredentialProtocol.
const (
	Hysteria2 ConnectCredentialProtocol = "hysteria2"
	Reality   ConnectCredentialProtocol = "reality"
)

// Valid indicates whether the value is a known member of the ConnectCredentialProtocol enum.
func (e ConnectCredentialProtocol) Valid() bool {
	switch e {
	case Hysteria2:
		return true
	case Reality:
		return true
	default:
		return false
	}
}

// Defines values for DevicePlatform.
const (
	Android DevicePlatform = "android"
	Ios     DevicePlatform = "ios"
	Linux   DevicePlatform = "linux"
	Macos   DevicePlatform = "macos"
	Windows DevicePlatform = "windows"
)

// Valid indicates whether the value is a known member of the DevicePlatform enum.
func (e DevicePlatform) Valid() bool {
	switch e {
	case Android:
		return true
	case Ios:
		return true
	case Linux:
		return true
	case Macos:
		return true
	case Windows:
		return true
	default:
		return false
	}
}

// Defines values for NodeTier.
const (
	NodeTierFree NodeTier = "free"
	NodeTierPro  NodeTier = "pro"
)

// Valid indicates whether the value is a known member of the NodeTier enum.
func (e NodeTier) Valid() bool {
	switch e {
	case NodeTierFree:
		return true
	case NodeTierPro:
		return true
	default:
		return false
	}
}

// Defines values for PlanCode.
const (
	PlanCodeFree PlanCode = "free"
	PlanCodePro  PlanCode = "pro"
	PlanCodeTeam PlanCode = "team"
)

// Valid indicates whether the value is a known member of the PlanCode enum.
func (e PlanCode) Valid() bool {
	switch e {
	case PlanCodeFree:
		return true
	case PlanCodePro:
		return true
	case PlanCodeTeam:
		return true
	default:
		return false
	}
}

// Defines values for RedeemResultPlanCode.
const (
	RedeemResultPlanCodeFree RedeemResultPlanCode = "free"
	RedeemResultPlanCodePro  RedeemResultPlanCode = "pro"
	RedeemResultPlanCodeTeam RedeemResultPlanCode = "team"
)

// Valid indicates whether the value is a known member of the RedeemResultPlanCode enum.
func (e RedeemResultPlanCode) Valid() bool {
	switch e {
	case RedeemResultPlanCodeFree:
		return true
	case RedeemResultPlanCodePro:
		return true
	case RedeemResultPlanCodeTeam:
		return true
	default:
		return false
	}
}

// Defines values for SubscriptionInfoPlanCode.
const (
	SubscriptionInfoPlanCodeFree SubscriptionInfoPlanCode = "free"
	SubscriptionInfoPlanCodePro  SubscriptionInfoPlanCode = "pro"
	SubscriptionInfoPlanCodeTeam SubscriptionInfoPlanCode = "team"
)

// Valid indicates whether the value is a known member of the SubscriptionInfoPlanCode enum.
func (e SubscriptionInfoPlanCode) Valid() bool {
	switch e {
	case SubscriptionInfoPlanCodeFree:
		return true
	case SubscriptionInfoPlanCodePro:
		return true
	case SubscriptionInfoPlanCodeTeam:
		return true
	default:
		return false
	}
}

// Defines values for SubscriptionInfoSource.
const (
	Admin SubscriptionInfoSource = "admin"
	Code  SubscriptionInfoSource = "code"
	Trial SubscriptionInfoSource = "trial"
)

// Valid indicates whether the value is a known member of the SubscriptionInfoSource enum.
func (e SubscriptionInfoSource) Valid() bool {
	switch e {
	case Admin:
		return true
	case Code:
		return true
	case Trial:
		return true
	default:
		return false
	}
}

// Defines values for UserInfoStatus.
const (
	Active    UserInfoStatus = "active"
	Suspended UserInfoStatus = "suspended"
)

// Valid indicates whether the value is a known member of the UserInfoStatus enum.
func (e UserInfoStatus) Valid() bool {
	switch e {
	case Active:
		return true
	case Suspended:
		return true
	default:
		return false
	}
}

// ConnectCredential sing-box 连接凭证，支持 REALITY 主线 + Hysteria2 备线。
// 每用户一个数据面 UUID（dp_uuid），与账号 UUID 解耦、可独立轮换；
// 节点侧只见 dp_uuid，零账号信息，单节点被抄不泄露用户库。
//
// **字段稳定性**：本 schema 可能随数据面树（任务 #5）最终敲定后 bump，
// 在正式实现前以该任务产出为权威依据。
type ConnectCredential struct {
	// Flow VLESS flow 参数，REALITY 协议时使用（通常为 `xtls-rprx-vision`）
	Flow *string `json:"flow,omitempty"`

	// Hysteria2 Hysteria2 备线参数（仅 protocol=hysteria2 或客户端协议降级时使用）
	Hysteria2 *Hysteria2Params `json:"hysteria2,omitempty"`

	// Port 主协议端口（REALITY 用 TCP 443；Hysteria2 用 UDP 443）
	Port int `json:"port"`

	// Protocol 优先协议（客户端按网络状况自动选；服务端返回当前最优）
	Protocol ConnectCredentialProtocol `json:"protocol"`

	// Reality REALITY 协议参数（仅 protocol=reality 时有意义）
	Reality *RealityParams `json:"reality,omitempty"`

	// Server 节点服务器地址（IP 或域名）
	Server string `json:"server"`

	// TtlSeconds 凭证有效秒数。免费版 = 当日剩余分钟数 × 60；付费版 = 86400（24h，在线自动续期）。
	TtlSeconds int `json:"ttl_seconds"`

	// Uuid 用户数据面 UUID（dp_uuid），即 VLESS uuid 字段。
	// Hysteria2 auth password 由同一 UUID 派生（客户端无需单独字段）。
	Uuid openapi_types.UUID `json:"uuid"`
}

// ConnectCredentialProtocol 优先协议（客户端按网络状况自动选；服务端返回当前最优）
type ConnectCredentialProtocol string

// Device defines model for Device.
type Device struct {
	// LastSeen 最后活跃时间（UTC ISO-8601）
	LastSeen time.Time `json:"last_seen"`

	// Name 设备名称（客户端上报，如「iPhone 15 Pro」）
	Name string `json:"name"`

	// Platform 设备平台
	Platform DevicePlatform `json:"platform"`

	// Uuid 设备 UUID
	Uuid openapi_types.UUID `json:"uuid"`
}

// DevicePlatform 设备平台
type DevicePlatform string

// Error 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type Error struct {
	// Code 机器可读错误码，例如 `auth.code_expired` / `redeem.already_redeemed`
	Code string `json:"code"`

	// MessageEn 英文错误文案（面向用户展示）
	MessageEn string `json:"message_en"`

	// MessageZh 中文错误文案（面向用户展示）
	MessageZh string `json:"message_zh"`
}

// Hysteria2Params Hysteria2 备线参数（仅 protocol=hysteria2 或客户端协议降级时使用）
type Hysteria2Params struct {
	// Obfs 混淆模式（可选，如 `salamander`）；null 表示不启用混淆
	Obfs *string `json:"obfs,omitempty"`

	// Password Hysteria2 auth password（由 dp_uuid 派生，服务端同源生成）
	Password string `json:"password"`

	// Port Hysteria2 UDP 端口（通常 443）
	Port int `json:"port"`
}

// Me defines model for Me.
type Me struct {
	Subscription SubscriptionInfo  `json:"subscription"`
	TodayUsage   TodayUsageSummary `json:"today_usage"`
	User         UserInfo          `json:"user"`
}

// Node 节点目录条目。**不含任何密钥或连接参数**（reality_pbk/sni/password 等），
// 这些信息仅在 POST /nodes/{id}/connect 成功后下发。
type Node struct {
	// Load 节点当前负载百分比（0~100），由 agent 每 30s 上报到 Redis
	Load int `json:"load"`

	// NameEn 节点英文名称
	NameEn string `json:"name_en"`

	// NameZh 节点中文名称
	NameZh string `json:"name_zh"`

	// Region 地区代码，2 字母大写（HK/JP/SG/US …）
	Region string `json:"region"`

	// Signal 信号格数（0~4），由 agent 上报延迟换算，客户端展示信号条
	Signal int `json:"signal"`

	// Tier 节点等级（free 节点免费版可用，pro 节点需付费订阅）
	Tier NodeTier `json:"tier"`

	// Uuid 节点 UUID（connect 时作为 path 参数）
	Uuid openapi_types.UUID `json:"uuid"`
}

// NodeTier 节点等级（free 节点免费版可用，pro 节点需付费订阅）
type NodeTier string

// NodeDirectory defines model for NodeDirectory.
type NodeDirectory struct {
	Nodes []Node `json:"nodes"`

	// Version 目录全局版本号；任何节点变更 bump 此值，客户端据此决定是否刷新缓存
	Version int64 `json:"version"`
}

// Notice defines model for Notice.
type Notice struct {
	// BodyEn 公告英文正文（Markdown）
	BodyEn string `json:"body_en"`

	// BodyZh 公告中文正文（Markdown）
	BodyZh string `json:"body_zh"`

	// Id 公告 UUID
	Id openapi_types.UUID `json:"id"`

	// PublishedAt 发布时间（UTC ISO-8601）
	PublishedAt time.Time `json:"published_at"`

	// TitleEn 公告英文标题
	TitleEn string `json:"title_en"`

	// TitleZh 公告中文标题
	TitleZh string `json:"title_zh"`
}

// Plan defines model for Plan.
type Plan struct {
	// AdGate 首次连接是否需要激励广告解锁（仅 free=true）
	AdGate bool `json:"ad_gate"`

	// Code 套餐唯一代码
	Code PlanCode `json:"code"`

	// DailyMinutes 每日可用分钟数上限；null 表示无限制（pro/team）
	DailyMinutes *int `json:"daily_minutes,omitempty"`

	// MaxDevices 最大同时在线设备数（free=1, pro=5, team=10）
	MaxDevices int `json:"max_devices"`
}

// PlanCode 套餐唯一代码
type PlanCode string

// RealityParams REALITY 协议参数（仅 protocol=reality 时有意义）
type RealityParams struct {
	// PublicKey REALITY 服务端公钥（x25519）
	PublicKey string `json:"public_key"`

	// ShortId REALITY short ID（十六进制字符串）
	ShortId string `json:"short_id"`

	// Sni TLS SNI 伪装域名
	Sni string `json:"sni"`
}

// RedeemResult 激活码兑换结果。幂等设计：同一用户重复提交同一码返回首次结果（非报错）。
type RedeemResult struct {
	// ExpiresAt 兑换后的订阅到期时间（UTC ISO-8601）
	ExpiresAt time.Time `json:"expires_at"`

	// ExtendedDays 本次顺延的天数（叠加而非覆盖）
	ExtendedDays int `json:"extended_days"`

	// PlanCode 本次兑换激活的套餐代码
	PlanCode RedeemResultPlanCode `json:"plan_code"`
}

// RedeemResultPlanCode 本次兑换激活的套餐代码
type RedeemResultPlanCode string

// SubscriptionInfo defines model for SubscriptionInfo.
type SubscriptionInfo struct {
	// ExpiresAt 订阅到期时间（UTC ISO-8601），免费版无到期时间时为 null
	ExpiresAt *time.Time `json:"expires_at,omitempty"`

	// PlanCode 当前套餐代码
	PlanCode SubscriptionInfoPlanCode `json:"plan_code"`

	// Source 订阅来源（试用 / 激活码 / 管理员）
	Source SubscriptionInfoSource `json:"source"`
}

// SubscriptionInfoPlanCode 当前套餐代码
type SubscriptionInfoPlanCode string

// SubscriptionInfoSource 订阅来源（试用 / 激活码 / 管理员）
type SubscriptionInfoSource string

// TodayUsageSummary defines model for TodayUsageSummary.
type TodayUsageSummary struct {
	// AdUnlocked 免费版今日是否已完成激励广告解锁
	AdUnlocked *bool `json:"ad_unlocked,omitempty"`

	// MinutesRemaining 今日剩余分钟数，付费无限制时为 null
	MinutesRemaining *int `json:"minutes_remaining"`

	// MinutesUsed 今日已使用分钟数
	MinutesUsed int `json:"minutes_used"`
}

// TokenPair defines model for TokenPair.
type TokenPair struct {
	// AccessToken JWT access token，有效期 15 分钟
	AccessToken string `json:"access_token"`

	// ExpiresIn access_token 有效秒数（固定 900）
	ExpiresIn int `json:"expires_in"`

	// RefreshToken Refresh token，有效期 30 天
	RefreshToken string `json:"refresh_token"`
}

// UsagePoint 单日用量数据点（无目的地/DNS/流量内容，仅字节数与分钟数，符合无日志承诺）
type UsagePoint struct {
	// BytesDown 当日下行字节数
	BytesDown int64 `json:"bytes_down"`

	// BytesUp 当日上行字节数
	BytesUp int64 `json:"bytes_up"`

	// Date 日期（UTC，YYYY-MM-DD）
	Date openapi_types.Date `json:"date"`

	// MinutesUsed 当日已用分钟数
	MinutesUsed int `json:"minutes_used"`
}

// UserInfo defines model for UserInfo.
type UserInfo struct {
	Email openapi_types.Email `json:"email"`

	// Status 账户状态
	Status UserInfoStatus `json:"status"`

	// Uuid 用户全局唯一标识（对外口径，永不暴露自增 ID）
	Uuid openapi_types.UUID `json:"uuid"`
}

// UserInfoStatus 账户状态
type UserInfoStatus string

// BadRequest 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type BadRequest = Error

// Conflict 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type Conflict = Error

// Forbidden 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type Forbidden = Error

// Internal 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type Internal = Error

// NotFound 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type NotFound = Error

// TooManyRequests 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type TooManyRequests = Error

// Unauthorized 统一错误响应体，三字段均 required。文案遵守脱敏口径（不含红线词）。
type Unauthorized = Error

// bearerAuthContextKey is the context key for bearerAuth security scheme
type bearerAuthContextKey string

// AdsUnlockJSONBody defines parameters for AdsUnlock.
type AdsUnlockJSONBody struct {
	// AdToken 广告 SDK 签发的服务端回执 token
	AdToken string `json:"ad_token"`

	// DeviceId 发起广告的设备 UUID
	DeviceId openapi_types.UUID `json:"device_id"`
}

// SendVerificationCodeJSONBody defines parameters for SendVerificationCode.
type SendVerificationCodeJSONBody struct {
	Email openapi_types.Email `json:"email"`
}

// LoginJSONBody defines parameters for Login.
type LoginJSONBody struct {
	Email    openapi_types.Email `json:"email"`
	Password string              `json:"password"`
}

// RefreshTokenJSONBody defines parameters for RefreshToken.
type RefreshTokenJSONBody struct {
	// RefreshToken 有效的 refresh token（30 天有效期）
	RefreshToken string `json:"refresh_token"`
}

// RegisterJSONBody defines parameters for Register.
type RegisterJSONBody struct {
	// Code 6 位数字验证码
	Code  string              `json:"code"`
	Email openapi_types.Email `json:"email"`

	// Password 用户密码，argon2id 存储
	Password string `json:"password"`
}

// ListNodesParams defines parameters for ListNodes.
type ListNodesParams struct {
	// IfVersion 客户端已缓存的目录版本号；命中则返回 304
	IfVersion *int64 `form:"if_version,omitempty" json:"if_version,omitempty"`
}

// ConnectNodeJSONBody defines parameters for ConnectNode.
type ConnectNodeJSONBody struct {
	// DeviceId 发起连接的设备 UUID
	DeviceId openapi_types.UUID `json:"device_id"`
}

// DisconnectNodeJSONBody defines parameters for DisconnectNode.
type DisconnectNodeJSONBody struct {
	// DeviceId 发起断开的设备 UUID
	DeviceId openapi_types.UUID `json:"device_id"`
}

// RedeemCodeJSONBody defines parameters for RedeemCode.
type RedeemCodeJSONBody struct {
	// Code Crockford Base32 激活码，16 位含校验位
	Code string `json:"code"`
}

// GetUsageParams defines parameters for GetUsage.
type GetUsageParams struct {
	// Days 查询最近几天，默认 7，最大 90
	Days *int `form:"days,omitempty" json:"days,omitempty"`
}

// AdsUnlockJSONRequestBody defines body for AdsUnlock for application/json ContentType.
type AdsUnlockJSONRequestBody AdsUnlockJSONBody

// SendVerificationCodeJSONRequestBody defines body for SendVerificationCode for application/json ContentType.
type SendVerificationCodeJSONRequestBody SendVerificationCodeJSONBody

// LoginJSONRequestBody defines body for Login for application/json ContentType.
type LoginJSONRequestBody LoginJSONBody

// RefreshTokenJSONRequestBody defines body for RefreshToken for application/json ContentType.
type RefreshTokenJSONRequestBody RefreshTokenJSONBody

// RegisterJSONRequestBody defines body for Register for application/json ContentType.
type RegisterJSONRequestBody RegisterJSONBody

// ConnectNodeJSONRequestBody defines body for ConnectNode for application/json ContentType.
type ConnectNodeJSONRequestBody ConnectNodeJSONBody

// DisconnectNodeJSONRequestBody defines body for DisconnectNode for application/json ContentType.
type DisconnectNodeJSONRequestBody DisconnectNodeJSONBody

// RedeemCodeJSONRequestBody defines body for RedeemCode for application/json ContentType.
type RedeemCodeJSONRequestBody RedeemCodeJSONBody
