package receiver

import (
	"errors"
	eng "jiraport/resolver/engineer"
	"jiraport/service/jira"
	"math/rand"

	"gorm.io/gorm"
)

type FiremasterReceiverSelector struct {
	db *gorm.DB
}

func NewFiremasterReceiverSelector(db *gorm.DB) (*FiremasterReceiverSelector, error) {
	return &FiremasterReceiverSelector{db: db}, nil
}

func (rs *FiremasterReceiverSelector) selectFiremaster(engineers []eng.Engineer) (*eng.Engineer, error) {
	if len(engineers) == 0 {
		return nil, errors.New("empty firemasters to select")
	}
	return &engineers[rand.Intn(len(engineers))], nil
}

func (rs *FiremasterReceiverSelector) SelectReceiver(name string, data interface{}) ([]Receiver, error) {
	if name != "firemaster" {
		return nil, nil
	}
	receivers := make([]Receiver, 0)
	if issue, ok := data.(*jira.Issue); ok {
		assigneeEmail := issue.AssigneeEmail
		if assigneeEmail == "" {
			return nil, &NoAssigneeError{s: "no assignee as receiver"}
		}

		engineers, err := eng.GetFiremasters(rs.db)
		if err != nil {
			return nil, err
		}
		if len(engineers) != 0 {
			engineer, err := rs.selectFiremaster(engineers)
			if err != nil {
				return nil, err
			}
			if engineer != nil {
				receivers = append(receivers, engineer)
			}
		}
	}
	return receivers, nil
}
