package auth

import (
	"encoding/base64"
	"math/rand"

	"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
	"golang.org/x/crypto/bcrypt"
)

// Handler encapsulates all Identity and Access HTTP logic
type Handler struct {
	Store domain.Store
}

// NewHandler creates a new Auth Handler
func NewHandler(store domain.Store) *Handler {
	return &Handler{Store: store}
}

// HashPassword takes a plaintext password, automatically generates a secure salt
func HashPassword(password string) (string, error) {
	bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	return string(bytes), err
}

// CheckPasswordHash securely compares a plaintext password with a stored bcrypt hash.
func CheckPasswordHash(password, hash string) bool {
	err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
	return err == nil
}

// GenerateSessionToken creates a cryptographically secure random string
func GenerateSessionToken() (string, error) {
	b := make([]byte, 32)
	_, err := rand.Read(b)
	if err != nil {
		return "", err
	}
	return base64.URLEncoding.EncodeToString(b), nil
}
