package systemconfig

import "time"

type ConfigDTO struct {
	ID          uint64    `json:"id"`
	Key         string    `json:"key"`
	Value       string    `json:"value"`
	Description string    `json:"description"`
	UpdatedBy   *uint64   `json:"updated_by"`
	CreatedAt   time.Time `json:"created_at"`
	UpdatedAt   time.Time `json:"updated_at"`
}

type UpdateRequest struct {
	Value       string `json:"value" binding:"required"`
	Description string `json:"description"`
}

type HomeAnnouncementsDTO struct {
	Items []string `json:"items"`
}

type HomeConfigDTO struct {
	Announcements  []string          `json:"announcements"`
	Banners        []HomeBannerItem  `json:"banners"`
	PublishOptions PublishOptionsDTO `json:"publish_options"`
}

type OrderAgreementsDTO struct {
	VirtualAssetPurchase AgreementContentDTO `json:"virtual_asset_purchase"`
	RenterAgreement      AgreementContentDTO `json:"renter_agreement"`
}

type PostRentalNoticeDTO struct {
	Title   string `json:"title"`
	Content string `json:"content"`
}

type AgreementContentDTO struct {
	Title   string `json:"title"`
	Content string `json:"content"`
}

type HomeBannerItem struct {
	Eyebrow  string `json:"eyebrow"`
	Title    string `json:"title"`
	Badge    string `json:"badge"`
	Pill     string `json:"pill"`
	Tone     string `json:"tone"`
	ImageURL string `json:"image_url,omitempty"`
}

type PublishOptionsDTO struct {
	ServerOptions      []string                `json:"server_options"`
	FaceOptions        []string                `json:"face_options"`
	RankOptions        []string                `json:"rank_options"`
	InsuranceOptions   []string                `json:"insurance_options"`
	LevelOptions       []string                `json:"level_options"`
	LoginMethodOptions []string                `json:"login_method_options"`
	RegionOptions      []string                `json:"region_options"`
	SkinGroups         []PublishOptionGroup    `json:"skin_groups"`
	QuantityItems      []PublishQuantityItem   `json:"quantity_items"`
	ScreenshotSlots    []PublishScreenshotSlot `json:"screenshot_slots"`
	BanRecordOptions   []string                `json:"ban_record_options"`
	BanEvidenceOptions []string                `json:"ban_evidence_options"`
	FireLevelMin       int                     `json:"fire_level_min"`
	PriceConfig        PublishPriceConfig      `json:"price_config"`
	DepositRecommend   PublishDepositRecommend `json:"deposit_recommend_config"`
	RatioConfig        PublishRatioConfig      `json:"ratio_config"`
}

type PublishOptionGroup struct {
	Key     string   `json:"key"`
	Title   string   `json:"title"`
	Options []string `json:"options"`
}

type PublishQuantityItem struct {
	Key         string `json:"key"`
	Label       string `json:"label"`
	Price       string `json:"price"`
	Placeholder string `json:"placeholder,omitempty"`
}

type PublishScreenshotSlot struct {
	Key      string `json:"key"`
	Label    string `json:"label"`
	Required bool   `json:"required"`
	Hint     string `json:"hint"`
}

type PublishPriceConfig struct {
	DepositPlaceholder string `json:"deposit_placeholder"`
	PricePlaceholder   string `json:"price_placeholder"`
	RatioDescription   string `json:"ratio_description"`
}

type PublishDepositRecommend struct {
	BaseAmount     float64                       `json:"base_amount"`
	SkinGroupRules []PublishDepositSkinGroupRule `json:"skin_group_rules"`
}

type PublishDepositSkinGroupRule struct {
	GroupKey      string  `json:"group_key"`
	Label         string  `json:"label"`
	AmountPerItem float64 `json:"amount_per_item"`
}

type PublishRatioConfig struct {
	InsuranceBaseRatios []PublishInsuranceBaseRatio `json:"insurance_base_ratios"`
	ConfigItems         []PublishRatioConfigItem    `json:"config_items"`
	CoinCorrections     []PublishCoinCorrection     `json:"coin_corrections"`
}

type PublishInsuranceBaseRatio struct {
	Insurance string  `json:"insurance"`
	Ratio     float64 `json:"ratio"`
}

type PublishRatioConfigItem struct {
	Key            string  `json:"key"`
	Label          string  `json:"label"`
	Kind           string  `json:"kind"`
	GroupKey       string  `json:"group_key,omitempty"`
	MissingPenalty float64 `json:"missing_penalty"`
}

type PublishCoinCorrection struct {
	ThresholdM float64 `json:"threshold_m"`
	Correction float64 `json:"correction"`
}

type PublishSalePriceConfig struct {
	FixedMarkupRules     []PublishSaleFixedMarkupRule     `json:"fixed_markup_rules"`
	RatioAdjustmentRules []PublishSaleRatioAdjustmentRule `json:"ratio_adjustment_rules"`
}

type PublishSaleFixedMarkupRule struct {
	MinM         float64 `json:"min_m"`
	MaxM         float64 `json:"max_m"`
	MarkupAmount float64 `json:"markup_amount"`
}

type PublishSaleRatioAdjustmentRule struct {
	MinM          float64 `json:"min_m"`
	MaxM          float64 `json:"max_m,omitempty"`
	RatioSubtract float64 `json:"ratio_subtract"`
}
