package communications

import (
	"errors"

	"github.com/thrasher-corp/gocryptotrader/communications/base"
	"github.com/thrasher-corp/gocryptotrader/communications/slack"
	"github.com/thrasher-corp/gocryptotrader/communications/smsglobal"
	"github.com/thrasher-corp/gocryptotrader/communications/smtpservice"
	"github.com/thrasher-corp/gocryptotrader/communications/telegram"
)

// Communications is the overarching type across the communications packages
type Communications struct {
	base.IComm
}

// ErrNoCommunicationRelayersEnabled returns when no relayers enabled
var ErrNoCommunicationRelayersEnabled = errors.New("no communication relayers enabled")

// NewComm sets up and returns a pointer to a Communications object
func NewComm(cfg *base.CommunicationsConfig) (*Communications, error) {
	if !cfg.IsAnyEnabled() {
		return nil, ErrNoCommunicationRelayersEnabled
	}

	var comm Communications
	if cfg.TelegramConfig.Enabled {
		Telegram := new(telegram.Telegram)
		Telegram.Setup(cfg)
		comm.IComm = append(comm.IComm, Telegram)
	}

	if cfg.SMSGlobalConfig.Enabled {
		SMSGlobal := new(smsglobal.SMSGlobal)
		SMSGlobal.Setup(cfg)
		comm.IComm = append(comm.IComm, SMSGlobal)
	}

	if cfg.SMTPConfig.Enabled {
		SMTP := new(smtpservice.SMTPservice)
		SMTP.Setup(cfg)
		comm.IComm = append(comm.IComm, SMTP)
	}

	if cfg.SlackConfig.Enabled {
		Slack := new(slack.Slack)
		Slack.Setup(cfg)
		comm.IComm = append(comm.IComm, Slack)
	}

	comm.Setup()
	return &comm, nil
}
