package redfishprofile

func lenovoProfile() Profile {
	return staticProfile{
		name:            "lenovo",
		priority:        20,
		safeForFallback: true,
		matchFn: func(s MatchSignals) int {
			score := 0
			if containsFold(s.SystemManufacturer, "lenovo") ||
				containsFold(s.ChassisManufacturer, "lenovo") {
				score += 80
			}
			for _, ns := range s.OEMNamespaces {
				if containsFold(ns, "lenovo") {
					score += 30
					break
				}
			}
			// Lenovo XClarity Controller (XCC) is the BMC product line.
			if containsFold(s.ServiceRootProduct, "xclarity") ||
				containsFold(s.ServiceRootProduct, "xcc") {
				score += 30
			}
			return min(score, 100)
		},
		extendAcquisition: func(plan *AcquisitionPlan, _ MatchSignals) {
			// Lenovo XCC BMC exposes Chassis/1/Sensors with hundreds of individual
			// sensor member documents (e.g. Chassis/1/Sensors/101L1). These are
			// not used by any LOGPile parser — thermal/power data is read from
			// the aggregate Chassis/*/Thermal and Chassis/*/Power endpoints. On
			// a real server they largely return errors, wasting many minutes.
			// Lenovo OEM subtrees under Oem/Lenovo/LEDs and Oem/Lenovo/Slots also
			// enumerate dozens of individual documents not relevant to inventory.
			ensureSnapshotExcludeContains(plan,
				"/Sensors/",               // individual sensor docs (Chassis/1/Sensors/NNN)
				"/Oem/Lenovo/LEDs/",       // individual LED status entries (~47 per server)
				"/Oem/Lenovo/Slots/",      // individual slot detail entries (~26 per server)
				"/Oem/Lenovo/Metrics/",    // operational metrics, not inventory
				"/Oem/Lenovo/History",     // historical telemetry
				"/Oem/Lenovo/ScheduledPower", // power scheduling config
				"/Oem/Lenovo/BootSettings/BootOrder", // individual boot order lists
				"/PortForwardingMap/",     // network port forwarding config
			)
			// Lenovo XCC BMC is typically slow (p95 latency often 3-5s even under
			// normal load). Set rate thresholds that don't over-throttle on the
			// first few requests, and give the ETA estimator a realistic baseline.
			ensureRatePolicy(plan, AcquisitionRatePolicy{
				TargetP95LatencyMS:      2000,
				ThrottleP95LatencyMS:    4000,
				MinSnapshotWorkers:      2,
				MinPrefetchWorkers:      1,
				DisablePrefetchOnErrors: true,
			})
			ensureETABaseline(plan, AcquisitionETABaseline{
				DiscoverySeconds:     15,
				SnapshotSeconds:      120,
				PrefetchSeconds:      30,
				CriticalPlanBSeconds: 40,
				ProfilePlanBSeconds:  20,
			})
			addPlanNote(plan, "lenovo xcc acquisition extensions enabled: noisy sensor/oem paths excluded from snapshot")
		},
	}
}
