// Copyright The Monogon Project Authors.
// SPDX-License-Identifier: Apache-2.0

package bringup

import (
	"context"

	"source.monogon.dev/osbase/pstore"
	"source.monogon.dev/osbase/supervisor"
)

// dumpAndCleanPstore dumps all files accumulated in the pstore into the log
// and clears them from the pstore. This allows looking at these logs and also
// keeps the pstore from overflowing the generally limited storage it has.
func dumpAndCleanPstore(ctx context.Context) error {
	logger := supervisor.Logger(ctx)
	dumps, err := pstore.GetKmsgDumps()
	if err != nil {
		logger.Errorf("Failed to recover logs from pstore: %v", err)
		return nil
	}
	for _, dump := range dumps {
		logger.Errorf("Recovered log from %v at %v. Reconstructed log follows.", dump.Reason, dump.OccurredAt)
		for _, line := range dump.Lines {
			logger.Warning(line)
		}
	}
	userspaceLines, err := pstore.GetPmsgDump()
	if err != nil {
		logger.Errorf("Failed to recover userspace logs from pstore: %v", err)
	}
	for _, line := range userspaceLines {
		logger.Warning(line)
	}
	cleanErr := pstore.ClearAll()
	if cleanErr != nil {
		logger.Errorf("Failed to clear pstore: %v", err)
	}
	// Retrying this is extremely unlikely to result in any change and is most
	// likely just going to generate large amounts of useless logs obscuring
	// errors.
	supervisor.Signal(ctx, supervisor.SignalHealthy)
	supervisor.Signal(ctx, supervisor.SignalDone)
	return nil
}
