package util

import (
	"encoding/base64"
	"fmt"
	"golang.org/x/crypto/bcrypt"
)

func HashPassword(plaintext string) (string, error) {
	bytes, err := bcrypt.GenerateFromPassword([]byte(plaintext), 14)
	if err != nil {
		return "", fmt.Errorf("cannot hash password: %w", err)
	}
	return base64.StdEncoding.EncodeToString(bytes), nil
}

func VerifyHash(base64Hash string, plaintext string) (bool, error) {
	hash, err := base64.StdEncoding.DecodeString(base64Hash)
	if err != nil {
		return false, fmt.Errorf("cannot decode base64 hash: %w", err)
	}
	err = bcrypt.CompareHashAndPassword(hash, []byte(plaintext))
	if err == bcrypt.ErrMismatchedHashAndPassword {
		return false, nil
	}
	if err != nil {
		return false, fmt.Errorf("cannot verify password: %w", err)
	}
	return true, nil
}