package service

import (
	"fmt"
	"sort"
	"strings"

	"github.com/tidbcloud/aisupport/services/oncall/db"
	"github.com/tidbcloud/aisupport/services/oncall/models"
)

func (s *ScheduleService) getTeamAvailableEngineers(teamID uint) ([]map[string]interface{}, error) {
	resMap := make(map[uint]map[string]interface{})

	var links []models.EngineerTeam
	if err := db.DB.Preload("Engineer").Where("team_id = ?", teamID).Find(&links).Error; err != nil {
		return nil, err
	}
	for _, link := range links {
		role := link.Role
		if role == "" {
			role = models.TeamRoleMember
		}
		resMap[link.Engineer.ID] = map[string]interface{}{
			"engineer_id":    link.Engineer.ID,
			"engineer_name":  link.Engineer.Name,
			"engineer_en":    link.Engineer.EnName,
			"engineer_email": link.Engineer.Email,
			"role":           role,
			// Kept for callers that predate the role ladder.
			"is_manager": link.HasRole(models.TeamRoleManager),
		}
	}

	res := make([]map[string]interface{}, 0, len(resMap))
	for _, value := range resMap {
		res = append(res, value)
	}

	sort.Slice(res, func(i, j int) bool {
		li := strings.ToLower(fmt.Sprintf("%v", res[i]["engineer_email"]))
		lj := strings.ToLower(fmt.Sprintf("%v", res[j]["engineer_email"]))
		return li < lj
	})

	return res, nil
}

func (s *ScheduleService) GetTeamAvailableEngineers(teamID uint) ([]map[string]interface{}, error) {
	return s.getTeamAvailableEngineers(teamID)
}
