package service

import (
	"context"

	"security-center-backend/internal/config"
	"security-center-backend/internal/pkg/cache"
	"security-center-backend/internal/repository"
	auditservice "security-center-backend/internal/service/audit"
	authsvc "security-center-backend/internal/service/auth"
	"security-center-backend/internal/service/directory"
	"security-center-backend/internal/service/jwt"
	"security-center-backend/internal/service/oauth"
)

type AuthService interface {
	GenerateLoginURL(ctx context.Context, provider string) (string, error)
	HandleCallback(ctx context.Context, provider string, code string, state string) (*authsvc.Session, error)
	RefreshAccessToken(ctx context.Context, refreshToken string) (*authsvc.TokenPair, error)
	Logout(ctx context.Context, accessToken string) error
	GenerateDevSession(ctx context.Context) (*authsvc.Session, error)
	GetCurrentUserProfile(ctx context.Context, userID uint64) (*authsvc.SessionUser, error)
	IsSSOEnabled() bool
}

type RefreshTokenRequest struct {
	RefreshToken string `json:"refresh_token" binding:"required"`
}

var ErrSSODisabled = authsvc.ErrSSODisabled

func NewAuthService(
	cfg config.AuthConfig,
	oauthCfg config.OAuthConfig,
	jwtManager *jwt.Manager,
	userRepo repository.UserRepository,
	roleRepo repository.RoleRepository,
	employeeRepo directory.EmployeeDirectory,
	cache *cache.Cache,
	auditLogger *auditservice.Service,
	googleClient *oauth.GoogleClient,
	auth0Client *oauth.Auth0Client,
) AuthService {
	return authsvc.New(cfg, oauthCfg, jwtManager, userRepo, roleRepo, cache, auditLogger, googleClient, auth0Client, employeeRepo)
}
