package store

import (
	"context"
	"errors"
)

// AnalysisResultReader loads completed analysis output for debug APIs.
type AnalysisResultReader interface {
	GetResult(analysisID string) (AnalysisResult, bool)
}

// MongoAnalysisLookup loads persisted analyses from MongoDB.
type MongoAnalysisLookup interface {
	GetAnalysisResult(ctx context.Context, analysisID string) (AnalysisResult, error)
}

// CompositeResultReader prefers Mongo results and falls back to in-memory jobs.
type CompositeResultReader struct {
	Mongo MongoAnalysisLookup
	Jobs  *AnalysisStore
}

// GetResult returns analysis output from Mongo when available.
func (r *CompositeResultReader) GetResult(analysisID string) (AnalysisResult, bool) {
	if r.Mongo != nil {
		result, err := r.Mongo.GetAnalysisResult(context.Background(), analysisID)
		if err == nil {
			return result, true
		}
		if !errors.Is(err, ErrArtifactNotFound) {
			// Fall through to in-memory on unexpected errors for debug resilience.
		}
	}
	if r.Jobs != nil {
		return r.Jobs.GetResult(analysisID)
	}
	return AnalysisResult{}, false
}
