package receiver

import (
	"fmt"

	"github.com/spf13/viper"
	"github.com/tidbcloud/jiraport/pkg/clients/engineer"
	"github.com/tidbcloud/jiraport/pkg/entity"
)

type CustomReceiverSelector struct {
	engineerClient engineer.Interface
}

func NewCustomReceiverSelector(engineerClient engineer.Interface) (*CustomReceiverSelector, error) {
	return &CustomReceiverSelector{engineerClient: engineerClient}, nil
}

func (rs *CustomReceiverSelector) SelectReceiver(name string, issue *entity.Issue) ([]Receiver, error) {
	if name != "custom" {
		return nil, nil
	}
	receivers := make([]Receiver, 0)
	customFiled := viper.GetString("custom-assignee")
	if customFiled == "" {
		return nil, fmt.Errorf("custom assignee is not defined")
	}
	customValueRaw := issue.RawIssue.Fields.Unknowns[customFiled]
	customValue, ok := customValueRaw.(map[string]interface{})
	if !ok {
		return nil, fmt.Errorf("fail to analyze the custom assignee from raw issue")
	}
	assigneeEmail, ok := customValue[`emailAddress`].(string)
	if !ok {
		return nil, fmt.Errorf("fail to parse email address as string")
	}
	if assigneeEmail == "" {
		return nil, &NoAssigneeError{s: "no custom assignee as receiver"}
	}
	assignee, err := rs.engineerClient.GetEngineerByEmail(assigneeEmail)
	if err != nil {
		return nil, err
	}
	if assignee != nil {
		receivers = append(receivers, assignee)
	}
	return receivers, nil
}
