package agents

import (
	"context"
	"encoding/json"
	"testing"
	"time"

	"github.com/Armur-Ai/Pentest-Swarm-AI/internal/pipeline"
	"github.com/Armur-Ai/Pentest-Swarm-AI/internal/swarm/blackboard"
	"github.com/Armur-Ai/Pentest-Swarm-AI/internal/swarm/verify"
	"github.com/google/uuid"
)

func TestLFISweep_ProbesFileParamsOnly(t *testing.T) {
	c := uuid.New()
	ctx := context.Background()
	board := blackboard.NewMemoryBoard(time.Now)
	writeEndpoint(ctx, board, c, "http://t/view?page=home") // page is a file-ish param
	writeEndpoint(ctx, board, c, "http://t/list?id=1")       // not file-ish

	a := &ExploitAgent{campaignID: c, seenLFI: make(map[string]struct{})}
	var probed []string
	a.SetLFIVerifier(func(_ context.Context, target string, _ *verify.ProbeSpec) (bool, string) {
		probed = append(probed, target)
		return true, "indicator \"root:\" present in attack"
	})
	a.lfiSweep(ctx, board, nil)

	if len(probed) != 1 {
		t.Fatalf("expected only the file-param endpoint probed, got %v", probed)
	}
	fs, _ := board.Query(ctx, blackboard.Predicate{Types: []blackboard.FindingType{blackboard.TypeMisconfig}})
	n := 0
	for _, f := range fs {
		var cf pipeline.ClassifiedFinding
		if json.Unmarshal(f.Data, &cf) == nil && cf.AttackCategory == "path traversal" && cf.Verified {
			n++
		}
	}
	if n != 1 {
		t.Fatalf("expected 1 VERIFIED path-traversal finding, got %d", n)
	}
}
