package golive

import (
	"errors"
	"strings"
	"testing"

	"github.com/niels/banking-app/backend/internal/domain"
)

func TestNormalizeGateParamsRequiresEvidenceForReadyGate(t *testing.T) {
	params := GateParams{
		GateNumber:      133,
		Phase:           PhaseStaging,
		Title:           "Staging uses non-default secrets.",
		Status:          StatusReady,
		DecisionSummary: "Staging secret check passed.",
	}

	err := normalizeGateParams(&params)
	if err == nil {
		t.Fatal("expected ready gate without evidence to fail")
	}
	if !errors.Is(err, domain.ErrValidation) || !strings.Contains(err.Error(), "evidence_reference") {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestNormalizeGateParamsRequiresApproverForApprovedGate(t *testing.T) {
	params := GateParams{
		GateNumber:        151,
		Phase:             PhaseProduction,
		Title:             "Executive go/no-go signoff is recorded.",
		Status:            StatusApproved,
		DecisionSummary:   "Launch approved.",
		EvidenceReference: "board-pack-2026-08-14",
	}

	err := normalizeGateParams(&params)
	if err == nil {
		t.Fatal("expected approved gate without approver to fail")
	}
	if !errors.Is(err, domain.ErrValidation) || !strings.Contains(err.Error(), "approver_name") {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestNormalizeGateParamsKeepsGateNumbersInExpectedPhase(t *testing.T) {
	params := GateParams{
		GateNumber:      143,
		Phase:           PhaseStaging,
		Title:           "Legal/licensing model approved.",
		Status:          StatusPending,
		DecisionSummary: "Wrong phase should be rejected.",
	}

	err := normalizeGateParams(&params)
	if err == nil {
		t.Fatal("expected production gate in staging phase to fail")
	}
	if !errors.Is(err, domain.ErrValidation) || !strings.Contains(err.Error(), "phase") {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestNormalizeGateParamsDefaultsKeyOwnerAndPriority(t *testing.T) {
	params := GateParams{
		GateNumber:        140,
		Phase:             PhaseClosedBeta,
		Title:             "Legal confirms beta wording does not imply real banking services.",
		Status:            StatusApproved,
		DecisionSummary:   "Legal approved test-money wording.",
		EvidenceReference: "legal-wording-approval-2026-08-14",
		ApproverName:      "Legal Owner",
	}

	if err := normalizeGateParams(&params); err != nil {
		t.Fatalf("expected valid go-live gate: %v", err)
	}
	if params.GateKey != "beta-legal-wording" {
		t.Fatalf("unexpected gate key: %q", params.GateKey)
	}
	if params.OwnerTeam != "legal" {
		t.Fatalf("unexpected owner team: %q", params.OwnerTeam)
	}
	if params.Priority != "P0" {
		t.Fatalf("unexpected priority: %q", params.Priority)
	}
}
