package main

import (
	"log"
	"os"

	"gitlab.com/dynaweb/ains-microservices/internal/auth"
	"gitlab.com/dynaweb/ains-microservices/pkg/config"
	"gitlab.com/dynaweb/ains-microservices/pkg/db"
	"gitlab.com/dynaweb/ains-microservices/pkg/delima"
	"gitlab.com/dynaweb/ains-microservices/pkg/jwt"
	"gitlab.com/dynaweb/ains-microservices/pkg/middleware"
	"gitlab.com/dynaweb/ains-microservices/pkg/oauth2"
)

func main() {
	if len(os.Args) > 1 && os.Args[1] == "healthcheck" {
		if err := middleware.Healthcheck(); err != nil {
			log.Fatalf("healthcheck: %v", err)
		}
		return
	}

	cfg, err := config.Load()
	if err != nil {
		log.Fatalf("config: %v", err)
	}

	users, schools := stores(cfg)
	tokens := jwt.NewManager(cfg)

	dclient := delima.New(cfg.IAMDelima.BaseURL, cfg.IAMDelima.Token)
	if cfg.IAMDelima.Mock {
		dclient = delima.New("", "")
	}

	google := oauth2.NewGoogle(cfg.Google.ClientID, cfg.Google.ClientSecret, cfg.Google.RedirectURL)
	svc := auth.NewService(users, schools, dclient, tokens, auth.NewMemoryDenylist(), cfg.Auth.PostLoginRedirect)
	handler := auth.NewHandler(svc, google, cfg)

	r := middleware.NewRouter(cfg, "auth")
	handler.Register(r)

	log.Printf("auth listening on %s", cfg.HTTP.Addr)
	if err := r.Run(cfg.HTTP.Addr); err != nil {
		log.Fatalf("auth: %v", err)
	}
}

func stores(cfg *config.Config) (auth.UserRepo, auth.SchoolRepo) {
	conn, err := db.Open(cfg)
	if err != nil {
		if cfg.App.IsProduction() {
			log.Fatalf("db: %v", err)
		}
		log.Printf("db unavailable (%v), using in-memory store", err)
		store := auth.NewMemoryStore()
		return store, store
	}
	store := auth.NewMySQLStore(conn)
	return store, store
}
