package backup

import (
	"context"
	"sync"

	"gitea.dooplex.hu/admin/felhom-agent/internal/hub"
)

// Store holds the agent's LATEST backup result per target and the latest restore-test
// result — the point-in-time state the host-report surfaces. It is updated by the backup
// runner + the restore-test scheduler/selftest and read by the collector via the hub
// BackupReporter / RestoreTestReporter seams. In-memory (lost on restart; the cadence
// re-populates) and mutex-guarded for the concurrent collector vs scheduler access.
type Store struct {
	mu       sync.Mutex
	byTarget map[string]hub.Backup // latest backup per target id
	lastTest *hub.RestoreTest
}

// NewStore builds an empty Store.
func NewStore() *Store {
	return &Store{byTarget: map[string]hub.Backup{}}
}

// RecordBackup stores the latest backup for its target.
func (s *Store) RecordBackup(b hub.Backup) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.byTarget[b.TargetID] = b
}

// RecordRestoreTest stores the latest restore-test result.
func (s *Store) RecordRestoreTest(r hub.RestoreTest) {
	s.mu.Lock()
	defer s.mu.Unlock()
	cp := r
	s.lastTest = &cp
}

// Backups implements hub.BackupReporter — the latest backup per target (stable order by
// target id is not guaranteed; the hub does not depend on order).
func (s *Store) Backups(context.Context) []hub.Backup {
	s.mu.Lock()
	defer s.mu.Unlock()
	out := make([]hub.Backup, 0, len(s.byTarget))
	for _, b := range s.byTarget {
		out = append(out, b)
	}
	return out
}

// RestoreTests implements hub.RestoreTestReporter — the latest restore-test result (0 or 1).
func (s *Store) RestoreTests(context.Context) []hub.RestoreTest {
	s.mu.Lock()
	defer s.mu.Unlock()
	if s.lastTest == nil {
		return []hub.RestoreTest{}
	}
	return []hub.RestoreTest{*s.lastTest}
}
