package config

import "github.com/zeromicro/go-zero/rest"

type Config struct {
	rest.RestConf
	DataSource      string      `json:",optional"`
	DryRun          bool        `json:",optional"`
	DevAuth         bool        `json:",default=true"`
	Auth            AuthConf    `json:",optional"`
	SMS             SMSConf     `json:",optional"`
	License         LicenseConf `json:",optional"`
	Agent           AgentConf   `json:",optional"`
	PublicBaseURL   string      `json:",optional"`
	RateLimitPerMin int         `json:",default=180"`
	Storage         StorageConf `json:",optional"`
	DBSync          DBSyncConf  `json:",optional"`
}

type AuthConf struct {
	AccessSecret string `json:",optional"`
	AccessExpire int64  `json:",default=86400"` // JWT 会话秒数；登录态时效，与授权到期无关
	IssueSecret  string `json:",optional"`
	// PhoneLoginOnly：仅允许手机号登录。默认 false。
	// 若 License.Enabled（有部署期限控制），运行时会忽略本开关，允许用户名登录。
	PhoneLoginOnly bool `json:",optional"`
	// DisableUsernameLoginIfPhoneBound：已绑手机禁止用户名登录（账号级策略仍可单独禁用）。
	DisableUsernameLoginIfPhoneBound bool `json:",optional"`
	// RequirePhoneBound：无手机号不可登录。有 License 期限时通常不必开启。
	RequirePhoneBound bool `json:",optional"`
}

// LicenseConf 客户机授权：每次续费/延期生成独立签名文件；运行时取目录中最新有效租约。
type LicenseConf struct {
	Enabled       bool   `json:",optional"`
	Customer      string `json:",optional"`
	LeaseDir      string `json:",optional"` // 默认 ./data/license/leases；租约文件目录
	StateDir      string `json:",optional"` // 默认 ./data/license/state；消费账本（与 leases 分离，防只删租约复用）
	LeasePath     string `json:",optional"` // 兼容旧字段
	ControlSecret string `json:",optional"`
	SignSecret    string `json:",optional"`
	SeedNotAfter  string `json:",optional"`
	GraceDays     int    `json:",optional"`
	Message       string `json:",optional"`
	NotAfter      string `json:",optional"`
	// RedeemURL 可选：你们的核销服务根地址。配置后导入延期包必须联网核销 id（防删库清盘后复用旧包）。
	// POST {RedeemURL}/v1/license/redeem  Body: {"id","customer","action":"redeem"}
	RedeemURL string `json:",optional"`
}

// SMSConf 短信验证码。Provider=dev 时不真实发信，验证码写日志并可在接口返回 debug_code。
type SMSConf struct {
	Provider       string `json:",default=dev"` // dev | off
	CodeTTLSeconds int    `json:",default=300"`
	ResendSeconds  int    `json:",default=60"`
	DevFixedCode   string `json:",optional"` // 开发可固定如 123456
	// RequireForBind：手机号确认绑定时是否强制短信。
	// 试运行/未接短信平台：false（关闭验证）；正式接入后改为 true。
	RequireForBind bool `json:",optional"`
}

type AgentConf struct {
	CapsuleSecret  string `json:",optional"`
	RegisterSecret string `json:",optional"` // 宿主自注册防刷；空则回退 IssueSecret/AccessSecret
	// YuhengTicket：仅宇恒平台签名凭票免登录（HMAC）；其它客户端勿用。
	YuhengTicket YuhengTicketConf `json:",optional"`
}

// YuhengTicketConf 宇恒 → 智建 短时凭票（scope=sync_bind | sync_restore）。
type YuhengTicketConf struct {
	Enabled  bool   `json:",optional"`
	Secret   string `json:",optional"` // 与宇恒共享；生产必换
	Issuer   string `json:",default=yuheng"`
	Audience string `json:",default=aijianzhan"`
	MaxAgeSec int   `json:",default=120"` // 签发端建议 TTL；验票另限 exp 不超过 now+10m
}

type StorageConf struct {
	Driver     string `json:",default=local"`
	LocalRoot  string `json:",default=./data/uploads"`
	PublicBase string `json:",optional"` // 默认 PublicBaseURL + /api/v1/storage
}

type DBSyncConf struct {
	Enabled            bool   `json:",default=true"`
	DataDir            string `json:",default=./data/dbsync"` // 通道/冲突/LWW 审计 JSON
	LwwAuditTTLDays    int    `json:",default=90"`             // 超管 LWW 覆盖日志保留天数
	ReconcileMinSec    int    `json:",default=300"`            // 手动对账最小间隔（秒）
	// Z12：公司默认同步通道（启用智能体时自动创建）
	DefaultRemoteDriver string `json:",default=postgres"`
	DefaultRemoteDSN    string `json:",optional"` // 空则用 sqlite 联调文件：./data/dbsync/tenant_{id}_online.db
}
