package receiver

import (
	"github.com/tidbcloud/jiraport/pkg/clients/engineer"
	"github.com/tidbcloud/jiraport/pkg/clients/oncall"
	"github.com/tidbcloud/jiraport/pkg/entity"
)

// LeaderReceiverSelector resolves the "leader" receiver to the managers of the
// alert's oncall_team, via the oncall service. Manager emails are resolved to
// engineers (for open_id/bot) through the engineer client.
type LeaderReceiverSelector struct {
	engineerClient engineer.Interface
	oncallClient   oncall.Interface
}

func NewLeaderReceiverSelector(engineerClient engineer.Interface, oncallClient oncall.Interface) (*LeaderReceiverSelector, error) {
	return &LeaderReceiverSelector{engineerClient: engineerClient, oncallClient: oncallClient}, nil
}

func (rs *LeaderReceiverSelector) SelectReceiver(name string, issue *entity.Issue) ([]Receiver, error) {
	if name != "leader" {
		return nil, nil
	}
	if rs.oncallClient == nil {
		return nil, &NoAssigneeError{s: "oncall client not configured for leader receiver"}
	}
	team := issue.OncallTeam()
	if team == "" {
		return nil, &NoAssigneeError{s: "no oncall_team to resolve leader"}
	}

	emails, err := rs.oncallClient.GetTeamManagers(team)
	if err != nil {
		return nil, err
	}
	receivers := resolveEngineers(rs.engineerClient, emails)
	if len(receivers) == 0 {
		return nil, &NoAssigneeError{s: "no leader (team managers) as receiver"}
	}
	return receivers, nil
}

// resolveEngineers turns emails into Receiver engineers, skipping any that don't
// resolve in the engineer DB (for open_id/bot).
func resolveEngineers(engineerClient engineer.Interface, emails []string) []Receiver {
	receivers := make([]Receiver, 0, len(emails))
	for _, e := range emails {
		if e == "" {
			continue
		}
		eng, err := engineerClient.GetEngineerByEmail(e)
		if err != nil || eng == nil || eng.Email == "" {
			continue
		}
		receivers = append(receivers, eng)
	}
	return receivers
}
