package spindle

import (
	"context"
	"io"
	"log/slog"
	"path/filepath"
	"strings"
	"testing"

	"github.com/bluesky-social/indigo/atproto/syntax"
	"tangled.org/core/spindle/config"
	"tangled.org/core/spindle/db"
	"tangled.org/core/spindle/models"
	"tangled.org/core/workflow"
)

func TestRunPipelineAnswersNoIdForAPipelineItFailedToEnqueue(t *testing.T) {
	src := newSourceRepo(t, "sha1")
	writeTestFile(t, filepath.Join(src, ".tangled/workflows/ci.yaml"), "engine: dummy\nwhen:\n  - event: push\n    branch: main\nsteps:\n  - name: build\n    command: \"true\"\n")
	commitEverything(t, src)
	sha := gitInDir(t, src, "rev-parse", "HEAD")

	d, err := db.Make(context.Background(), filepath.Join(t.TempDir(), "spindle.db"))
	if err != nil {
		t.Fatal(err)
	}
	t.Cleanup(func() { d.Close() })
	const repoDid = syntax.DID("did:plc:runpipeline")
	if err := d.AddRepo(db.Repo{Knot: "knot.example.com", Owner: "did:plc:owner", Rkey: "repo", RepoDid: repoDid}); err != nil {
		t.Fatal(err)
	}
	cfg := &config.Config{}
	cfg.Server.Admission = config.AdmissionOpen
	s := &Spindle{db: d, cfg: cfg, l: slog.New(slog.NewTextHandler(io.Discard, nil)), rootCtx: context.Background()}

	repoStr := repoDid.String()
	trigger := workflow.TriggerMetadata{
		Kind: "push",
		Push: &workflow.PushTriggerData{NewSha: sha, OldSha: strings.Repeat("0", 40), Ref: "refs/heads/main"},
		Repo: &workflow.TriggerRepo{Did: "did:plc:owner", Knot: "knot.example.com", RepoDid: &repoStr, DefaultBranch: "main"},
	}
	run := func() (models.PipelineId, error) {
		return s.runPipeline(context.Background(), "same-id", repoDid, trigger, nil, src, filepath.Join(t.TempDir(), "checkout"), sha, nil, nil, false)
	}
	if id, err := run(); err != nil || id != "same-id" {
		t.Fatalf("first run = %q, %v, want its id", id, err)
	}
	if id, err := run(); err == nil || id != "" {
		t.Fatalf("second run = %q, %v, want an error and no id", id, err)
	}
}
