package api

import (
	"encoding/json"
	"time"

	"oci-portal/internal/model"
	"oci-portal/internal/oci"
	"oci-portal/internal/service"
)

// 本文件的类型仅供 swagger 文档渲染(@Success/@Failure 注解引用),
// 运行时代码不使用;字段与各 handler 返回的 gin.H 外壳保持一致。

// errorResponse 是统一错误响应外壳。
type errorResponse struct {
	Error string `json:"error"`
}

// itemsResponse 是 {"items": [...]} 列表外壳。
type itemsResponse[T any] struct {
	Items []T `json:"items"`
}

// pagedResponse 是 {"items": [...], "total": n} 分页外壳。
type pagedResponse[T any] struct {
	Items []T   `json:"items"`
	Total int64 `json:"total"`
}

// itemResponse 是 {"item": {...}} 单项外壳。
type itemResponse[T any] struct {
	Item T `json:"item"`
}

// triggerResponse 是任务触发受理响应。
type triggerResponse struct {
	Triggered bool `json:"triggered"`
}

// tokenResponse 是登录 / 换发令牌响应。
type tokenResponse struct {
	Token     string    `json:"token"`
	ExpiresAt time.Time `json:"expiresAt"`
}

// totpRequiredResponse 是密码通过但需两步验证码的 428 响应。
type totpRequiredResponse struct {
	Error        string `json:"error"`
	TotpRequired bool   `json:"totpRequired"`
}

// enabledResponse 是布尔开关查询响应。
type enabledResponse struct {
	Enabled bool `json:"enabled"`
}

// totpSetupResponse 是 TOTP 初始化响应。
type totpSetupResponse struct {
	Secret     string `json:"secret"`
	OtpauthUri string `json:"otpauthUri"`
}

// credentialsResponse 是当前登录账号信息。
type credentialsResponse struct {
	Username              string `json:"username"`
	PasswordLoginDisabled bool   `json:"passwordLoginDisabled"`
}

// oauthProvidersResponse 是外部登录 provider 列表。
type oauthProvidersResponse struct {
	Providers             []service.ProviderInfo `json:"providers"`
	PasswordLoginDisabled bool                   `json:"passwordLoginDisabled"`
}

// urlResponse 是跳转地址响应。
type urlResponse struct {
	URL string `json:"url"`
}

// aboutResponse 是「设置 · 关于」页构建与运行信息。
type aboutResponse struct {
	Version       string         `json:"version"`
	BuildTime     string         `json:"buildTime"`
	GoVersion     string         `json:"goVersion"`
	Platform      string         `json:"platform"`
	StartedAt     string         `json:"startedAt"`
	UptimeSeconds int64          `json:"uptimeSeconds"`
	Resources     aboutResources `json:"resources"`
}

// aboutResources 是进程资源占用快照。
type aboutResources struct {
	CpuAvgPercent float64 `json:"cpuAvgPercent"`
	NumCpu        int     `json:"numCpu"`
	Goroutines    int     `json:"goroutines"`
	MemHeapBytes  uint64  `json:"memHeapBytes"`
	MemSysBytes   uint64  `json:"memSysBytes"`
	DbEngine      string  `json:"dbEngine"`
	DbBytes       int64   `json:"dbBytes"`
}

// publicIpResponse 是换绑公网 IP 结果。
type publicIpResponse struct {
	PublicIp string `json:"publicIp"`
}

// ipv6AddressResponse 是实例新增 IPv6 结果。
type ipv6AddressResponse struct {
	Ipv6Address string `json:"ipv6Address"`
}

// addressResponse 是 VNIC 新增 IPv6 结果。
type addressResponse struct {
	Address string `json:"address"`
}

// ipv6StepsResponse 是 VCN 开启 IPv6 的分步结果。
type ipv6StepsResponse struct {
	Steps []oci.IPv6Step `json:"steps"`
}

// configChangesResponse 是租户配置校验 / 更新结果(config 与字段变更对照)。
type configChangesResponse struct {
	Config  *model.OciConfig `json:"config"`
	Changes service.Changes  `json:"changes"`
}

// aiKeyCreateResponse 是 AI 密钥创建结果;key 为明文,仅本次返回。
type aiKeyCreateResponse struct {
	Key  string      `json:"key"`
	Item model.AiKey `json:"item"`
}

// usedByResponse 是代理关联租户结果(关联数)。
type usedByResponse struct {
	UsedBy int64 `json:"usedBy"`
}

// rawDetailResponse 是审计事件原文响应。
type rawDetailResponse struct {
	Raw json.RawMessage `json:"raw"`
}

// passwordResponse 是租户用户重置密码结果(一次性明文)。
type passwordResponse struct {
	Password string `json:"password"`
}

// deletedTotpResponse 是清除 MFA 设备结果。
type deletedTotpResponse struct {
	DeletedTotpDevices int `json:"deletedTotpDevices"`
}

// deletedApiKeysResponse 是清理用户 API Key 结果。
type deletedApiKeysResponse struct {
	DeletedApiKeys int `json:"deletedApiKeys"`
}

// createInstancesResponse 是批量创建实例结果;部分成功仍 201,errors 为逐台失败信息。
type createInstancesResponse struct {
	Instances []oci.Instance `json:"instances"`
	Errors    []string       `json:"errors"`
}

// logWebhookStatusResponse 是日志回传 webhook 状态。
type logWebhookStatusResponse struct {
	Exists  bool                    `json:"exists"`
	Webhook *service.LogWebhookInfo `json:"webhook,omitempty"`
}

// webConsoleSessionResponse 是网页控制台会话创建结果。
type webConsoleSessionResponse struct {
	SessionId string `json:"sessionId"`
	Type      string `json:"type"`
}
