package main

import (
	"context"
	"fmt"
	"strings"
	"time"

	"github.com/patrickmn/go-cache"

	"go.sour.is/ev"
	"go.sour.is/tools/app/webfinger"
	"go.sour.is/pkg/env"
	"go.sour.is/pkg/lg"
	"go.sour.is/pkg/service"
	"go.sour.is/pkg/slice"
)

var (
	defaultExpire   = 3 * time.Minute
	cleanupInterval = 10 * time.Minute
)

var _ = apps.Register(50, func(ctx context.Context, svc *service.Harness) error {
	ctx, span := lg.Span(ctx)
	defer span.End()

	span.AddEvent("Enable WebFinger")
	eventstore, ok := slice.Find[*ev.EventStore](svc.Services...)
	if !ok {
		return fmt.Errorf("*es.EventStore not found in services")
	}

	cache := cache.New(defaultExpire, cleanupInterval)
	var withCache webfinger.WithCache = (func(s string) bool {
		if _, ok := cache.Get(s); ok {
			return true
		}
		cache.SetDefault(s, true)
		return false
	})
	var withHostnames webfinger.WithHostnames = strings.Fields(env.Default("WEBFINGER_DOMAINS", "sour.is"))

	wf, err := webfinger.New(ctx, eventstore, withCache, withHostnames)
	if err != nil {
		span.RecordError(err)
		return err
	}
	svc.Add(wf)

	return nil
})
