package packs

import (
	"context"
	"testing"

	"github.com/nexuscrm/metadata"
	"github.com/nexuscrm/shared/pkg/models"
)

func TestApplyFlowRuntimeMaintenanceRefreshesStaleFlowDefinitionCache(t *testing.T) {
	ctx := context.Background()
	db, cleanup := openFlowRuntimeMaintenanceTestDB(t)
	defer cleanup()

	seedFlowRuntimeMaintenanceObject(t, ctx, db, "obj-probe", "ProbeObject", "a00")
	repo := &flowRuntimeMaintenanceShadowRepo{exec: db}
	metaSvc := metadata.NewMetadataService(repo, nil, nil)

	if got := metaSvc.GetFlowDefinitions(ctx); len(got) != 0 {
		t.Fatalf("initial GetFlowDefinitions() len = %d, want empty stale cache", len(got))
	}

	seedFlowRuntimeMaintenanceDefinition(t, ctx, db, "300000000000001AAA", "301000000000001AAA")
	seedFlowRuntimeMaintenanceVersion(t, ctx, db, "301000000000001AAA", "300000000000001AAA", flowRuntimeMaintenanceMetadata("RecordAfterSave", "CreateAndUpdate", "ProbeObject"))
	repo.flowDefinitions = []*models.FlowDefinition{{
		Id:              "300000000000001AAA",
		DeveloperName:   "Probe_Flow",
		ProcessType:     "AutoLaunchedFlow",
		ActiveVersionId: "301000000000001AAA",
	}}
	repo.flowVersions = map[string]*models.FlowVersion{
		"301000000000001AAA": {
			Id:           "301000000000001AAA",
			DefinitionId: "300000000000001AAA",
			ProcessType:  "AutoLaunchedFlow",
			MetadataRaw:  []byte(flowRuntimeMaintenanceMetadata("RecordAfterSave", "CreateAndUpdate", "ProbeObject")),
		},
	}

	if err := ApplyFlowRuntimeMaintenance(ctx, metaSvc); err != nil {
		t.Fatalf("ApplyFlowRuntimeMaintenance() error = %v", err)
	}
	if len(repo.flowDefinitions) != 1 {
		t.Fatalf("flowDefinitions len = %d, want 1", len(repo.flowDefinitions))
	}
	def := repo.flowDefinitions[0]
	if def.TriggerType != "RecordAfterSave" || def.TriggerObjectOrEvent != "ProbeObject" {
		t.Fatalf("flow definition projection = (%q, %q), want (RecordAfterSave, ProbeObject)", def.TriggerType, def.TriggerObjectOrEvent)
	}
}
