package types

import "encoding/json"

type PublishReq struct {
	Blueprint json.RawMessage `json:"blueprint"`
	// Mode:
	//   "" / "auto" — 模块已存在则发布新生成的页面，不存在则新建（默认）
	//   "add_pages" — 必须已存在，把草稿中的新页面发布到该模块（亦接受别名 merge）
	//   "create"    — 必须不存在，新建模块
	//   "replace"   — 整份蓝图覆盖（旧行为）
	Mode string `json:"mode,omitempty"`
	// HostMeta 宿主（宇恒）侧展示用元数据，原样回写到响应，便于宿主表格展示。
	HostMeta *PublishHostMeta `json:"host_meta,omitempty"`
}

type PublishHostMeta struct {
	ModuleName   string `json:"module_name,omitempty"`   // 模块名称（宿主表格「应用/模块名称」）
	PublishStyle string `json:"publish_style,omitempty"` // 如 immediate → 立即发布上线
	HostBaseURL  string `json:"host_base_url,omitempty"` // 宿主域名，如 https://whm123.yuheng.com
}

type PublishResp struct {
	AppID             string            `json:"app_id"`
	Slug              string            `json:"slug"`
	SchemaName        string            `json:"schema_name"`
	DatabaseName      string            `json:"database_name,omitempty"`
	Status            string            `json:"status"`
	Endpoints         []string          `json:"endpoints"`
	DDL               []string          `json:"ddl,omitempty"`
	MemoryMode        bool              `json:"memory_mode"`
	PublishMode       string            `json:"publish_mode"` // created | pages_added | replaced | host_meta_updated | storage_isolated
	AddedPages        []string          `json:"added_pages,omitempty"`
	AddedEntities     []string          `json:"added_entities,omitempty"`
	AddedResources    []string          `json:"added_resources,omitempty"`
	BlueprintRevision string            `json:"blueprint_revision,omitempty"`
	ResourceTables    map[string]string `json:"resource_tables,omitempty"`
	// 宿主建站回执（对应「AI 表格数据」）
	ModuleName   string `json:"module_name,omitempty"`
	PublishStyle string `json:"publish_style,omitempty"`
	AccessPath   string `json:"access_path,omitempty"`  // 加密文件路径，如 m/ajzm1_...
	AccessURL    string `json:"access_url,omitempty"`   // 可打开的地址（宿主域名或平台公开地址）
	PublishedAt  string `json:"published_at,omitempty"` // RFC3339
	OwnerID      int64  `json:"owner_id,omitempty"`     // 用于路径加密的用户/智能体 id
}

type AppListItem struct {
	AppID        string `json:"app_id"`
	Slug         string `json:"slug"`
	Name         string `json:"name"`
	Status       string `json:"status"`
	StatusLabel  string `json:"status_label"` // 已发布 / 在建 / 失败
	Building     bool   `json:"building"`     // 在建（含草稿、发布中）
	SchemaName   string `json:"schema_name,omitempty"`
	DatabaseName string `json:"database_name,omitempty"` // database_per_app 时有值
	PageCount    int    `json:"page_count"`
	EntityCount  int    `json:"entity_count"`
	UpdatedAt    string `json:"updated_at"`
	CreatedAt    string `json:"created_at"`
}

type AppListResp struct {
	Items []AppListItem `json:"items"`
	// Scope: all = 管理账号看本租户全部；granted = 智能体仅已授权
	Scope string `json:"scope,omitempty"`
}

type DraftReq struct {
	Blueprint json.RawMessage `json:"blueprint"`
}

type PageResult struct {
	Items    []map[string]any `json:"items"`
	Page     int              `json:"page"`
	PageSize int              `json:"page_size"`
	Total    int              `json:"total"`
}

type TokenReq struct {
	GrantType    string `json:"grant_type,omitempty"` // client_credentials
	ClientID     string `json:"client_id,omitempty"`
	ClientSecret string `json:"client_secret,omitempty"`
	TenantID     int64  `json:"tenant_id"`
	UserID       int64  `json:"user_id"`
	Role         string `json:"role,omitempty"`
	Secret       string `json:"secret"`
}

type TokenResp struct {
	AccessToken           string   `json:"access_token"`
	TokenType             string   `json:"token_type"`
	ExpiresAt             int64    `json:"expires_at"`
	TenantID              int64    `json:"tenant_id"`
	UserID                int64    `json:"user_id"`
	Username              string   `json:"username,omitempty"`
	Phone                 string   `json:"phone,omitempty"`
	UsernameLoginDisabled bool     `json:"username_login_disabled,omitempty"`
	DisplayName           string   `json:"display_name,omitempty"`
	Role                  string   `json:"role,omitempty"`
	OrgUnitID             int64    `json:"org_unit_id,omitempty"`
	Status                string   `json:"status,omitempty"` // pending | active
	AgentKey              string   `json:"agent_key"`
	AgentID               int64    `json:"agent_id,omitempty"`
	Permissions           []string `json:"permissions,omitempty"`
	AppSlugs              []string `json:"app_slugs,omitempty"`
	Message               string   `json:"message,omitempty"`
	TenantName            string   `json:"tenant_name,omitempty"` // 超管打开某公司管理视图时带回
	// Z12a：同步落点（智能体/已绑用户）
	ChannelID    string `json:"channel_id,omitempty"`
	OnlineDBID   string `json:"online_db_id,omitempty"`
	DatabaseName string `json:"database_name,omitempty"`
	SyncBound    bool   `json:"sync_bound"`
}

type AgentCreateReq struct {
	Name         string   `json:"name"`
	RoleID       int64    `json:"role_id"`
	Permissions  []string `json:"permissions"`
	AppSlugs     []string `json:"app_slugs"`
	ChannelID    string   `json:"channel_id,omitempty"`
	OnlineDBID   string   `json:"online_db_id,omitempty"`
	DatabaseName string   `json:"database_name,omitempty"`
}

type AgentUpdateReq struct {
	Name         *string   `json:"name,omitempty"`
	Status       *string   `json:"status,omitempty"`
	RoleID       *int64    `json:"role_id,omitempty"`
	Permissions  *[]string `json:"permissions,omitempty"`
	AppSlugs     *[]string `json:"app_slugs,omitempty"`
	ChannelID    *string   `json:"channel_id,omitempty"`
	OnlineDBID   *string   `json:"online_db_id,omitempty"`
	DatabaseName *string   `json:"database_name,omitempty"`
}

type AgentCreateResp struct {
	Account      any    `json:"account"`
	ClientSecret string `json:"client_secret"`
}

type AgentSecretResp struct {
	ClientID     string `json:"client_id"`
	ClientSecret string `json:"client_secret"`
}

type RoleCreateReq struct {
	Code        string   `json:"code"`
	Name        string   `json:"name"`
	Description string   `json:"description"`
	Permissions []string `json:"permissions"`
}

type RoleUpdateReq struct {
	Name        *string   `json:"name,omitempty"`
	Description *string   `json:"description,omitempty"`
	Permissions *[]string `json:"permissions,omitempty"`
}

// AgentSelfRegisterReq 宿主首次连接自注册（公开）。
type AgentSelfRegisterReq struct {
	Name           string `json:"name"`
	HostKey        string `json:"host_key,omitempty"` // 宿主稳定标识，用于幂等
	TenantID       int64  `json:"tenant_id,omitempty"`
	RegisterSecret string `json:"register_secret"`
}

type AgentSelfRegisterResp struct {
	Account      any    `json:"account"`
	ClientSecret string `json:"client_secret"`
	Reused       bool   `json:"reused"` // 同一 host_key 的 pending 重连会轮换 secret
	Message      string `json:"message"`
}

type RegisterReq struct {
	Username    string `json:"username"`
	Password    string `json:"password"`
	DisplayName string `json:"display_name"`
}

type LoginReq struct {
	Username string `json:"username,omitempty"` // 用户名；也可填手机号（密码登录）
	Phone    string `json:"phone,omitempty"`    // 手机号登录时使用
	Password string `json:"password,omitempty"`
	SMSCode  string `json:"sms_code,omitempty"` // 短信验证码登录（与 password 二选一）
}

type SMSSendReq struct {
	Phone   string `json:"phone"`
	Purpose string `json:"purpose,omitempty"` // login | bind，默认 login
}

type SMSSendResp struct {
	OK         bool   `json:"ok"`
	ExpiresIn  int    `json:"expires_in"`
	RetryAfter int    `json:"retry_after,omitempty"`
	Message    string `json:"message,omitempty"`
	DebugCode  string `json:"debug_code,omitempty"` // 仅 Provider=dev 时返回
}

type InviteCreateReq struct {
	Role           string `json:"role"`             // owner | editor | viewer
	OrgUnitID      int64  `json:"org_unit_id"`      // 可选，加入后绑定组织
	MaxUses        int    `json:"max_uses"`         // 默认 1
	ExpiresInHours int    `json:"expires_in_hours"` // 0=不过期
}

type InviteAcceptReq struct {
	Code string `json:"code"`
}

type TenantCreateReq struct {
	Name string `json:"name"`
}

type OrgUnitCreateReq struct {
	ParentID int64  `json:"parent_id"`
	Name     string `json:"name"`
	Code     string `json:"code"`
}

type OrgUnitUpdateReq struct {
	Name *string `json:"name,omitempty"`
	Code *string `json:"code,omitempty"`
}

type CapsuleResp struct {
	// Capsule 密文：AJZ1.<nonce>.<ciphertext>，不含明文 API 契约
	Capsule string `json:"capsule"`
	Format  string `json:"format"`
	Hint    string `json:"hint"`
}

type ImportResp struct {
	Inserted int      `json:"inserted"`
	Skipped  int      `json:"skipped"`
	Errors   []string `json:"errors"`
}

type AggregateResp struct {
	Total    int               `json:"total"`
	GroupBy  string            `json:"group_by,omitempty"`
	Buckets  []AggregateBucket `json:"buckets,omitempty"`
	SumField string            `json:"sum_field,omitempty"`
	Sum      float64           `json:"sum,omitempty"`
}

type AggregateBucket struct {
	Key   string  `json:"key"`
	Count int     `json:"count"`
	Sum   float64 `json:"sum,omitempty"`
}

type AuditListResp struct {
	Items    []any `json:"items"`
	Total    int   `json:"total"`
	Page     int   `json:"page"`
	PageSize int   `json:"page_size"`
}

type UploadResp struct {
	Key         string `json:"key"`
	URL         string `json:"url"`
	Filename    string `json:"filename"`
	ContentType string `json:"content_type"`
	Size        int64  `json:"size"`
}
