package notification

import (
	"context"
	"errors"
	"log/slog"

	"github.com/nomadcode/nomadcode-core/internal/adapters/mattermost"
)

type Service struct {
	mattermost *mattermost.Client
	logger     *slog.Logger
	sinks      []TaskEventSink
}

func NewService(mattermostClient *mattermost.Client, logger *slog.Logger, sinks ...TaskEventSink) *Service {
	return &Service{
		mattermost: mattermostClient,
		logger:     logger,
		sinks:      append([]TaskEventSink{}, sinks...),
	}
}

func (s *Service) NotifyTaskCompleted(ctx context.Context, input TaskNotification) error {
	return s.NotifyTaskEvent(ctx, TaskEvent{
		Type:    TaskEventCompleted,
		TaskID:  input.TaskID,
		Title:   input.Title,
		Status:  input.Status,
		Message: input.Message,
	})
}

func (s *Service) NotifyTaskEvent(ctx context.Context, input TaskEvent) error {
	if s.logger != nil {
		s.logger.Info("task event notification requested", "type", input.Type, "task_id", input.TaskID)
	}

	var errs []error
	for _, sink := range s.sinks {
		if err := sink.HandleTaskEvent(ctx, input); err != nil {
			errs = append(errs, err)
		}
	}

	if input.Type == TaskEventCompleted && s.mattermost != nil {
		errs = append(errs, s.mattermost.SendTaskNotification(ctx, mattermost.TaskNotificationInput{
			TaskID:  input.TaskID,
			Title:   input.Title,
			Status:  input.Status,
			Message: input.Message,
		}))
	}

	return errors.Join(errs...)
}
