extends Node
## Top-level mutable game state. SaveSystem serializes via save_dict() / apply_dict().
##
## Holds session-wide flags and the "what map are we on" pointer. Per-entity state
## lives on the entities themselves; per-tile state on the TileMap or World.
## See docs/architecture.md.

var current_map_id: StringName = &"slice_temperate_forest"
var session_started_at_unix: int = 0  # for "you've been away X minutes" toast

# Phase 17 — player settings persisted across sessions.
# Auto-pause booleans mirror the SettingsMenu checkboxes.
# Audio floats are 0.0..1.0; default 1.0 (full volume).
# Accessibility stubs wired in a later phase.
var settings: Dictionary = {
	"pause_on_threat":    true,
	"pause_on_wanderer":  true,
	"pause_on_pawn_down": true,
	"pause_on_modal":     true,
	"audio_master":       1.0,
	"audio_music":        1.0,
	"audio_sfx":          1.0,
	"audio_ambient":      1.0,
	"accessibility_large_text":   false,
	"accessibility_reduce_motion": false,
}


func _ready() -> void:
	session_started_at_unix = int(Time.get_unix_time_from_system())


## Apply a dictionary of setting values.  Unknown keys are silently ignored so
## callers can pass partial dicts (e.g. only the audio block).  Each recognised
## key is type-coerced to match the default type in `settings`.
func apply_settings(d: Dictionary) -> void:
	for key in d:
		if not settings.has(key):
			continue
		var default_val = settings[key]
		if default_val is bool:
			settings[key] = bool(d[key])
		elif default_val is float:
			settings[key] = clampf(float(d[key]), 0.0, 1.0)
		else:
			settings[key] = d[key]


# Phase 16 expands these into real save round-trip.
func save_dict() -> Dictionary:
	return {
		"current_map_id": String(current_map_id),
		"session_started_at_unix": session_started_at_unix,
		"settings": settings.duplicate(),
	}


func apply_dict(d: Dictionary) -> void:
	if d.has("current_map_id"):
		current_map_id = StringName(d["current_map_id"])
	if d.has("session_started_at_unix"):
		session_started_at_unix = int(d["session_started_at_unix"])
	# Phase 17 — restore settings block; partial saves are fine.
	if d.has("settings") and d["settings"] is Dictionary:
		apply_settings(d["settings"])
