package helpers

import (
	"context"
	"testing"

	"github.com/tidbcloud/devops/entity"
	tntent "github.com/tidbcloud/devops/entity/tenant"
	"github.com/tidbcloud/devops/pkg/infra/config"
)

func TestGetResponsiblePersonEmailForRegionalGMByRegion(t *testing.T) {
	responsiblePersons := &config.RTResponsiblePersonConfig{
		RegionalGM: config.RTRegionalGMConfig{
			APAC:   "apac-gm@pingcap.com",
			EMEA:   "emea-gm@pingcap.com",
			JP:     "jp-gm@pingcap.com",
			NA:     "na-gm@pingcap.com",
			Backup: "backup-gm@pingcap.com",
		},
	}

	cases := []struct {
		name     string
		region   *tntent.TenantRegion
		expected string
	}{
		{name: "apac", region: ptrRegion(tntent.TenantRegionAPAC), expected: "apac-gm@pingcap.com"},
		{name: "emea", region: ptrRegion(tntent.TenantRegionEMEA), expected: "emea-gm@pingcap.com"},
		{name: "jp", region: ptrRegion(tntent.TenantRegionJapan), expected: "jp-gm@pingcap.com"},
		{name: "na", region: ptrRegion(tntent.TenantRegionNA), expected: "na-gm@pingcap.com"},
		{name: "unknown", region: ptrRegion(tntent.TenantRegionUnknown), expected: "backup-gm@pingcap.com"},
		{name: "nil region", region: nil, expected: "backup-gm@pingcap.com"},
	}

	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			email, err := GetResponsiblePersonEmail(context.Background(), responsiblePersons, &entity.RemediationTicket{
				BizRegion: tc.region,
			}, entity.RemediationTicketPhaseRegionalGM)
			if err != nil {
				t.Fatalf("GetResponsiblePersonEmail returned error: %v", err)
			}
			if email != tc.expected {
				t.Fatalf("GetResponsiblePersonEmail() = %q, want %q", email, tc.expected)
			}
		})
	}
}

func TestGetSuccessApprovalCCEmailsByRegion(t *testing.T) {
	conf := map[string][]string{
		string(tntent.TenantRegionAPAC): {"apac-cc@pingcap.com", "APAC-CC@pingcap.com", " "},
		"default":                       {"default-cc@pingcap.com"},
	}

	emails := GetSuccessApprovalCCEmails(conf, &entity.RemediationTicket{
		BizRegion: ptrRegion(tntent.TenantRegionAPAC),
	})
	if len(emails) != 1 || emails[0] != "apac-cc@pingcap.com" {
		t.Fatalf("GetSuccessApprovalCCEmails() = %#v, want APAC deduplicated email", emails)
	}

	emails = GetSuccessApprovalCCEmails(conf, &entity.RemediationTicket{
		BizRegion: ptrRegion(tntent.TenantRegionEMEA),
	})
	if len(emails) != 1 || emails[0] != "default-cc@pingcap.com" {
		t.Fatalf("GetSuccessApprovalCCEmails() = %#v, want default email", emails)
	}
}

func ptrRegion(region tntent.TenantRegion) *tntent.TenantRegion {
	return &region
}
