package notification

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

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

func NewService(logger *slog.Logger, sinks ...TaskEventSink) *Service {
	return &Service{
		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)
		}
	}

	return errors.Join(errs...)
}
