package factory

import (
	"log/slog"

	"github.com/emochka2007/block-accounting/internal/pkg/config"
	"github.com/emochka2007/block-accounting/internal/usecase/interactors/chain"
	"github.com/emochka2007/block-accounting/internal/usecase/interactors/jwt"
	"github.com/emochka2007/block-accounting/internal/usecase/interactors/organizations"
	"github.com/emochka2007/block-accounting/internal/usecase/interactors/transactions"
	"github.com/emochka2007/block-accounting/internal/usecase/interactors/users"
	"github.com/emochka2007/block-accounting/internal/usecase/repository/auth"
	"github.com/emochka2007/block-accounting/internal/usecase/repository/cache"
	orepo "github.com/emochka2007/block-accounting/internal/usecase/repository/organizations"
	txRepo "github.com/emochka2007/block-accounting/internal/usecase/repository/transactions"
	urepo "github.com/emochka2007/block-accounting/internal/usecase/repository/users"
)

func provideUsersInteractor(
	log *slog.Logger,
	usersRepo urepo.Repository,
	chainInteractor chain.ChainInteractor,
) users.UsersInteractor {
	return users.NewUsersInteractor(log.WithGroup("users-interactor"), usersRepo, chainInteractor)
}

func provideJWTInteractor(
	c config.Config,
	usersInteractor users.UsersInteractor,
	authRepository auth.Repository,
) jwt.JWTInteractor {
	return jwt.NewJWT(c.Common.JWTSecret, usersInteractor, authRepository)
}

func provideOrganizationsInteractor(
	log *slog.Logger,
	orgRepo orepo.Repository,
	cache cache.Cache,
) organizations.OrganizationsInteractor {
	return organizations.NewOrganizationsInteractor(log, orgRepo, cache)
}

func provideTxInteractor(
	log *slog.Logger,
	txRepo txRepo.Repository,
	orgInteractor organizations.OrganizationsInteractor,
	chainInteractor chain.ChainInteractor,
) transactions.TransactionsInteractor {
	return transactions.NewTransactionsInteractor(
		log.WithGroup("transaction-interactor"),
		txRepo,
		orgInteractor,
		chainInteractor,
	)
}

func provideChainInteractor(
	log *slog.Logger,
	config config.Config,
	txRepository txRepo.Repository,
) chain.ChainInteractor {
	return chain.NewChainInteractor(log, config, txRepository)
}
