package orchestrator_test

import (
	"context"
	"path/filepath"
	"testing"

	"github.com/flothus/tmux-xterm-research/server-go/internal/harness/event"
	"github.com/flothus/tmux-xterm-research/server-go/internal/harness/orchestrator"
	"github.com/flothus/tmux-xterm-research/server-go/internal/harness/store"
)

func TestPhaseI_PolicySignerApprovesInZoneEdit(t *testing.T) {
	tmp := t.TempDir()
	st, err := store.Open(filepath.Join(tmp, "harness.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer st.Close()
	orch := orchestrator.New(st, event.NewBus(st))
	ctx := context.Background()
	_ = orch.CreateRun(ctx, "run-i", "")

	d := orchestrator.Draft{
		Kind: "code_edit",
		Payload: map[string]any{
			"path": "client/src/Foo.vue",
			"zone": "client/**/*",
		},
	}
	id, err := orch.SubmitDraft(ctx, d, filepath.Join(tmp, "drafts"))
	if err != nil {
		t.Fatal(err)
	}
	approved, reason, err := orch.SignDraft(ctx, id, orchestrator.PolicySigner{})
	if err != nil {
		t.Fatal(err)
	}
	if !approved {
		t.Errorf("expected approval, got rejection: %s", reason)
	}
	var status string
	_ = st.DB().QueryRow(`SELECT status FROM action_drafts WHERE id=?`, id).Scan(&status)
	if status != "approved" {
		t.Errorf("status = %s, want approved", status)
	}
}

func TestPhaseI_PolicySignerRejectsOrgModification(t *testing.T) {
	tmp := t.TempDir()
	st, err := store.Open(filepath.Join(tmp, "harness.db"))
	if err != nil {
		t.Fatal(err)
	}
	defer st.Close()
	orch := orchestrator.New(st, event.NewBus(st))
	ctx := context.Background()

	d := orchestrator.Draft{
		Kind:    "modify_org",
		Payload: map[string]any{"diff": "rename roles/fe to roles/web"},
	}
	id, err := orch.SubmitDraft(ctx, d, filepath.Join(tmp, "drafts"))
	if err != nil {
		t.Fatal(err)
	}
	approved, _, err := orch.SignDraft(ctx, id, orchestrator.PolicySigner{})
	if err != nil {
		t.Fatal(err)
	}
	if approved {
		t.Error("expected rejection for org modification")
	}
}
