package notify

import (
	"context"
	"fmt"

	"golang.org/x/sync/errgroup"

	"github.com/usual2970/certimate/internal/pkg/core/notifier"
	"github.com/usual2970/certimate/internal/pkg/utils/maps"
	"github.com/usual2970/certimate/internal/utils/app"
)

func SendToAllChannels(subject, message string) error {
	notifiers, err := getEnabledNotifiers()
	if err != nil {
		return err
	}
	if len(notifiers) == 0 {
		return nil
	}

	var eg errgroup.Group
	for _, n := range notifiers {
		if n == nil {
			continue
		}

		eg.Go(func() error {
			_, err := n.Notify(context.Background(), subject, message)
			return err
		})
	}

	err = eg.Wait()
	return err
}

func SendToChannel(subject, message string, channel string, channelConfig map[string]any) error {
	notifier, err := createNotifier(channel, channelConfig)
	if err != nil {
		return err
	}

	_, err = notifier.Notify(context.Background(), subject, message)
	return err
}

func getEnabledNotifiers() ([]notifier.Notifier, error) {
	settings, err := app.GetApp().Dao().FindFirstRecordByFilter("settings", "name='notifyChannels'")
	if err != nil {
		return nil, fmt.Errorf("find notifyChannels error: %w", err)
	}

	rs := make(map[string]map[string]any)
	if err := settings.UnmarshalJSONField("content", &rs); err != nil {
		return nil, fmt.Errorf("unmarshal notifyChannels error: %w", err)
	}

	notifiers := make([]notifier.Notifier, 0)
	for k, v := range rs {
		if !maps.GetValueAsBool(v, "enabled") {
			continue
		}

		notifier, err := createNotifier(k, v)
		if err != nil {
			continue
		}

		notifiers = append(notifiers, notifier)
	}

	return notifiers, nil
}