package repository

import (
	"context"

	"git.kirlllll.ru/volontery/backend/internal/database"
)

// AuthRepository предоставляет методы для работы с аутентификацией
type AuthRepository struct {
	queries *database.Queries
}

// NewAuthRepository создает новый AuthRepository
func NewAuthRepository(queries *database.Queries) *AuthRepository {
	return &AuthRepository{queries: queries}
}

// CreateRefreshToken создает новый refresh токен
func (r *AuthRepository) CreateRefreshToken(ctx context.Context, params database.CreateRefreshTokenParams) (*database.RefreshToken, error) {
	result, err := r.queries.CreateRefreshToken(ctx, params)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// GetRefreshToken получает refresh токен
func (r *AuthRepository) GetRefreshToken(ctx context.Context, token string) (*database.RefreshToken, error) {
	result, err := r.queries.GetRefreshToken(ctx, token)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// RevokeRefreshToken отзывает refresh токен
func (r *AuthRepository) RevokeRefreshToken(ctx context.Context, id int64) error {
	return r.queries.RevokeRefreshToken(ctx, id)
}

// RevokeAllUserTokens отзывает все токены пользователя
func (r *AuthRepository) RevokeAllUserTokens(ctx context.Context, userID int64) error {
	return r.queries.RevokeAllUserTokens(ctx, userID)
}

// CreateUserSession создает новую сессию
func (r *AuthRepository) CreateUserSession(ctx context.Context, params database.CreateUserSessionParams) (*database.UserSession, error) {
	result, err := r.queries.CreateUserSession(ctx, params)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// GetUserSession получает сессию по токену
func (r *AuthRepository) GetUserSession(ctx context.Context, sessionToken string) (*database.UserSession, error) {
	result, err := r.queries.GetUserSession(ctx, sessionToken)
	if err != nil {
		return nil, err
	}
	return &result, nil
}

// UpdateSessionActivity обновляет время активности сессии
func (r *AuthRepository) UpdateSessionActivity(ctx context.Context, id int64) error {
	return r.queries.UpdateSessionActivity(ctx, id)
}

// InvalidateUserSession удаляет сессию
func (r *AuthRepository) InvalidateUserSession(ctx context.Context, id int64) error {
	return r.queries.InvalidateUserSession(ctx, id)
}
