package helpers

import (
	"context"
	"fmt"
	"strings"

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

func RemediationTicketDetailLink(ticketID uint64) string {
	return fmt.Sprintf("https://%s/remediation_tickets/%d", consts.ConsoleAddr(), ticketID)
}

func GetResponsiblePersonEmail(ctx context.Context, config *config.RTResponsiblePersonConfig, ticket *entity.RemediationTicket, phase entity.RemediationTicketPhase) (string, error) {
	responsiblePersonConfig := config
	switch phase {
	case entity.RemediationTicketPhaseCreated:
		return ticket.ApplicantEmail, nil
	case entity.RemediationTicketPhaseRegionTSELeader:
		return getRegionBasedPersonEmail(ticket, responsiblePersonConfig.RegionTSELeader.APAC, responsiblePersonConfig.RegionTSELeader.EMEA, responsiblePersonConfig.RegionTSELeader.JP, responsiblePersonConfig.RegionTSELeader.NA, responsiblePersonConfig.RegionTSELeader.Backup), nil
	case entity.RemediationTicketPhaseRDGSLAOwner:
		if ticket.ClusterType == entity.RemediationTicketClusterTypeServerless {
			return responsiblePersonConfig.RDGSLAOwner.ServerlessPerson, nil
		} else {
			return responsiblePersonConfig.RDGSLAOwner.DediacatedPerson, nil
		}
	case entity.RemediationTicketPhaseRDGFinalDecisionMaker:
		return responsiblePersonConfig.RDGFinalDecisionMaker.Person, nil
	case entity.RemediationTicketPhaseGlobalDealDesk:
		return responsiblePersonConfig.GlobalDealDesk.Person, nil
	case entity.RemediationTicketPhaseCommercialOperation:
		return responsiblePersonConfig.CommercialOperation.Person, nil
	case entity.RemediationTicketPhaseRegionalGM:
		return getRegionBasedPersonEmail(ticket, responsiblePersonConfig.RegionalGM.APAC, responsiblePersonConfig.RegionalGM.EMEA, responsiblePersonConfig.RegionalGM.JP, responsiblePersonConfig.RegionalGM.NA, responsiblePersonConfig.RegionalGM.Backup), nil
	default:
		return "", fmt.Errorf("cannot find responsible person for phase %s", phase)
	}

}

func getRegionBasedPersonEmail(ticket *entity.RemediationTicket, apac string, emea string, jp string, na string, backup string) string {
	if ticket == nil || ticket.BizRegion == nil {
		return backup
	}

	switch *ticket.BizRegion {
	case tntent.TenantRegionAPAC:
		return apac
	case tntent.TenantRegionEMEA:
		return emea
	case tntent.TenantRegionJapan:
		return jp
	case tntent.TenantRegionNA:
		return na
	default:
		return backup
	}
}

func GetSuccessApprovalCCEmails(conf map[string][]string, ticket *entity.RemediationTicket) []string {
	if len(conf) == 0 || ticket == nil || ticket.BizRegion == nil {
		return nil
	}

	emails := conf[string(*ticket.BizRegion)]
	if len(emails) == 0 {
		emails = conf[strings.ToUpper(string(*ticket.BizRegion))]
	}
	if len(emails) == 0 {
		emails = conf["default"]
	}

	return deduplicateEmails(emails)
}

func deduplicateEmails(emails []string) []string {
	if len(emails) == 0 {
		return nil
	}

	seen := make(map[string]struct{}, len(emails))
	result := make([]string, 0, len(emails))
	for _, email := range emails {
		email = strings.TrimSpace(email)
		if email == "" {
			continue
		}
		key := strings.ToLower(email)
		if _, ok := seen[key]; ok {
			continue
		}
		seen[key] = struct{}{}
		result = append(result, email)
	}
	return result
}
