package packs

import (
	"strings"
	"testing"
)

func TestLoadStandardFlowSeedsFromPayloadsRejectsUnsupportedAtomicTriggerShape(t *testing.T) {
	tests := []struct {
		name    string
		payload []byte
	}{
		{
			name: "record after-save trigger",
			payload: []byte(`{
				"label":"Bad",
				"processType":"AutoLaunchedFlow",
				"runAtomically":true,
				"start":{"triggerType":"RecordAfterSave","object":"ProbeObject"}
			}`),
		},
		{
			name: "workflow-derived after-save trigger",
			payload: []byte(`{
				"label":"Bad Workflow",
				"processType":"Workflow",
				"runAtomically":true,
				"variables":[{"name":"myVariable_current","dataType":"SObject","objectType":"Lead"}]
			}`),
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			_, err := LoadStandardFlowSeedsFromPayloads(map[string][]byte{"Bad.flow.json": tc.payload})
			if err == nil {
				t.Fatal("LoadStandardFlowSeedsFromPayloads() error = nil, want unsupported atomic trigger rejection")
			}
			if !strings.Contains(err.Error(), `triggerType "RecordAfterSave" is unsupported`) {
				t.Fatalf("error = %v, want unsupported trigger detail", err)
			}
		})
	}
}

func TestLoadStandardFlowSeedsFromPayloadsOwnsDesiredStatus(t *testing.T) {
	seeds, err := LoadStandardFlowSeedsFromPayloads(map[string][]byte{
		"Active_Default.flow.json": []byte(`{"label":"Default"}`),
		"Draft_Flow.flow.json":     []byte(`{"label":"Draft","status":"Draft"}`),
	})
	if err != nil {
		t.Fatalf("LoadStandardFlowSeedsFromPayloads: %v", err)
	}
	if len(seeds) != 2 {
		t.Fatalf("seed count = %d, want 2", len(seeds))
	}
	if seeds[0].Status != "Active" {
		t.Fatalf("default status = %q, want Active", seeds[0].Status)
	}
	if seeds[1].Status != "Draft" {
		t.Fatalf("authored status = %q, want Draft", seeds[1].Status)
	}

	if _, err := LoadStandardFlowSeedsFromPayloads(map[string][]byte{
		"Bad.flow.json": []byte(`{"status":"Obsolete"}`),
	}); err == nil || !strings.Contains(err.Error(), "must be Active or Draft") {
		t.Fatalf("unsupported status error = %v, want Active/Draft rejection", err)
	}
}
