package hooks

import (
	"context"

	"github.com/arangodb/go-driver"

	"github.com/SecurityBrewery/catalyst/index"
)

type Hooks struct {
	DatabaseAfterConnectFuncs []func(ctx context.Context, client driver.Client, name string)
	IngestionFilterFunc       func(ctx context.Context, index *index.Index) (string, error)
	TicketReadFilterFunc      func(ctx context.Context) (string, map[string]any, error)
	TicketWriteFilterFunc     func(ctx context.Context) (string, map[string]any, error)
	GetGroupsFunc             func(ctx context.Context, username string) ([]string, error)
}

func (h *Hooks) DatabaseAfterConnect(ctx context.Context, client driver.Client, name string) {
	for _, f := range h.DatabaseAfterConnectFuncs {
		f(ctx, client, name)
	}
}

func (h *Hooks) IngestionFilter(ctx context.Context, index *index.Index) (string, error) {
	if h.IngestionFilterFunc != nil {
		return h.IngestionFilterFunc(ctx, index)
	}

	return "[]", nil
}

func (h *Hooks) TicketReadFilter(ctx context.Context) (string, map[string]any, error) {
	if h.TicketReadFilterFunc != nil {
		return h.TicketReadFilterFunc(ctx)
	}

	return "", nil, nil
}

func (h *Hooks) TicketWriteFilter(ctx context.Context) (string, map[string]any, error) {
	if h.TicketWriteFilterFunc != nil {
		return h.TicketWriteFilterFunc(ctx)
	}

	return "", nil, nil
}

func (h *Hooks) GetGroups(ctx context.Context, username string) ([]string, error) {
	if h.GetGroupsFunc != nil {
		return h.GetGroupsFunc(ctx, username)
	}

	return nil, nil
}
