package main

import (
	"context"
	"log/slog"
	"os"
	"os/signal"
	"syscall"

	"github.com/niels/banking-app/backend/internal/config"
	"github.com/niels/banking-app/backend/internal/ledger"
	"github.com/niels/banking-app/backend/internal/platform/database"
	"github.com/niels/banking-app/backend/internal/platform/logger"
	"github.com/niels/banking-app/backend/internal/settlement"
)

func main() {
	cfg, err := config.Load()
	if err != nil {
		slog.Error("configuration error", "error", err)
		os.Exit(1)
	}

	log := logger.New(cfg.App.Environment, cfg.Observability.StructuredLogs)
	slog.SetDefault(log)

	ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
	defer stop()

	db, err := database.Connect(ctx, cfg.Database)
	if err != nil {
		log.Error("database connection failed", "error", err)
		os.Exit(1)
	}
	defer db.Close()

	if !cfg.Features.Payments || !cfg.Settlement.SEPAEnabled {
		log.Info("worker idle because settlement is disabled", "payments_feature_enabled", cfg.Features.Payments, "sepa_settlement_enabled", cfg.Settlement.SEPAEnabled)
		<-ctx.Done()
		return
	}

	log.Info("banking worker started", "env", cfg.App.Environment, "async_backend", cfg.Runtime.AsyncBackend)
	settlement.NewWorker(settlement.NewRepository(db, ledger.NewRepository(db)), cfg.Settlement, log).Run(ctx)
	log.Info("banking worker stopped")
}
