package qslcard

// Preset describes one named typography style (a layer-stack recipe the
// frontend renders as SVG). AllowedParams whitelists the style_params keys
// the preset understands; Validate rejects anything else.
type Preset struct {
	Name          string          `json:"name"`
	Label         string          `json:"label"`
	AllowedParams map[string]bool `json:"-"`
	Defaults      StyleParams     `json:"defaults"`
}

// gelParams are the knobs shared by the layered "gel" stacks.
var gelParams = map[string]bool{
	"gradient": true, "shine": true, "outline_color": true, "outline_width": true,
	"halo": true, "shadow": true, "bevel_offset": true, "fx": true,
}

// Presets is the built-in style registry, keyed by preset name.
var Presets = map[string]Preset{
	"gel_gold": {
		Name:          "gel_gold",
		Label:         "Gel gold",
		AllowedParams: gelParams,
		Defaults: StyleParams{
			Gradient:     []string{"#FFE22D", "#FFD600", "#FFCC00"}, // bright XV9Q yellows; orange depth comes from the FX inner shadow
			Shine:        &Shine{Coverage: 0.6, Opacity: 1},
			OutlineColor: "#2a3f5c", OutlineWidth: 10,
			Halo:        &Halo{Color: "#cdd9e4", Blur: 6, Opacity: 0.4},
			Shadow:      &ShadowFx{Dx: 6, Dy: 9, Blur: 5, Color: "#14243a", Opacity: 0.55},
			BevelOffset: &Bevel{Dx: -3, Dy: -6, Dark: "#A85F00", Light: "#FFF6C8"},
		},
	},
	"gel_silver": {
		Name:          "gel_silver",
		Label:         "Gel silver",
		AllowedParams: gelParams,
		Defaults: StyleParams{
			Gradient:     []string{"#FBFDFF", "#C9D4DE", "#8496A8"},
			Shine:        &Shine{Coverage: 0.52, Opacity: 0.95},
			OutlineColor: "#3c4654", OutlineWidth: 10,
			Halo:        &Halo{Color: "#dfe7ee", Blur: 6, Opacity: 0.4},
			Shadow:      &ShadowFx{Dx: 6, Dy: 9, Blur: 5, Color: "#1b2530", Opacity: 0.55},
			BevelOffset: &Bevel{Dx: -3, Dy: -6, Dark: "#67788b", Light: "#FFFFFF"},
		},
	},
	"gel_gold_grunge": {
		Name:          "gel_gold_grunge",
		Label:         "Gel gold (vintage)",
		AllowedParams: gelParams,
		Defaults: StyleParams{
			Gradient:     []string{"#FFC83A", "#F0A21E", "#D87A00"},
			Shine:        &Shine{Coverage: 0.42, Opacity: 0.8},
			OutlineColor: "#1c130a", OutlineWidth: 11,
			Halo:        &Halo{Color: "#d8c08a", Blur: 5, Opacity: 0.3},
			Shadow:      &ShadowFx{Dx: 5, Dy: 8, Blur: 4, Color: "#1a0f04", Opacity: 0.55},
			BevelOffset: &Bevel{Dx: -2, Dy: -4, Dark: "#A85F00", Light: "#FFE08A"},
		},
	},
	"gel_silver_grunge": {
		Name:          "gel_silver_grunge",
		Label:         "Gel silver (vintage)",
		AllowedParams: gelParams,
		Defaults: StyleParams{
			Gradient:     []string{"#EEF2F6", "#C2CDD8", "#8593A3"},
			Shine:        &Shine{Coverage: 0.42, Opacity: 0.8},
			OutlineColor: "#16191f", OutlineWidth: 11,
			Halo:        &Halo{Color: "#cdd6df", Blur: 5, Opacity: 0.3},
			Shadow:      &ShadowFx{Dx: 5, Dy: 8, Blur: 4, Color: "#10141a", Opacity: 0.55},
			BevelOffset: &Bevel{Dx: -2, Dy: -4, Dark: "#6c7d8f", Light: "#FFFFFF"},
		},
	},
	"classic_white_outline": {
		Name:  "classic_white_outline",
		Label: "Classic white outline",
		AllowedParams: map[string]bool{
			"gradient": true, "outline_color": true, "outline_width": true, "shadow": true,
		},
		Defaults: StyleParams{
			Gradient:     []string{"#FFD83A", "#FFC312", "#EE9400"},
			OutlineColor: "#ffffff", OutlineWidth: 11,
			Shadow: &ShadowFx{Dx: 4, Dy: 6, Blur: 6, Color: "#1c2b3d", Opacity: 0.45},
		},
	},
	"script_white": {
		Name:  "script_white",
		Label: "Script white",
		AllowedParams: map[string]bool{
			"color": true, "outline_color": true, "outline_width": true, "shadow": true,
		},
		Defaults: StyleParams{
			Color:        "#ffffff",
			OutlineColor: "#22364e", OutlineWidth: 2,
		},
	},
	"outlined_white": {
		Name:  "outlined_white",
		Label: "Outlined white",
		AllowedParams: map[string]bool{
			"color": true, "outline_color": true, "outline_width": true,
		},
		Defaults: StyleParams{
			Color:        "#ffffff",
			OutlineColor: "#22364e", OutlineWidth: 5,
		},
	},
	"flat_modern": {
		Name:          "flat_modern",
		Label:         "Flat modern",
		AllowedParams: map[string]bool{"color": true},
		Defaults:      StyleParams{Color: "#ffffff"},
	},
}

// Layout archetypes produced by the placement engine.
const (
	ArchetypeSideColumn  = "side_column"  // inserts stacked in a side column
	ArchetypeBottomStrip = "bottom_strip" // inserts in a strip along the bottom
	ArchetypeFullBleed   = "full_bleed"   // hero photo only, no inserts
)

// Built-in fonts (embedded OFL files in assets/fonts; see fonts.go). The
// names match the @font-face family names registered in the frontend.
const (
	FontDisplayDefault = "Archivo Black"
	FontScriptDefault  = "Great Vibes"
	FontInfoLine       = "system-bold-sans"
)
