package users

import "golang.org/x/crypto/bcrypt"

type Role string

const (
	RoleUnset Role = ""
	RoleUser  Role = "user"
	RoleAdmin Role = "admin"
)

type User struct {
	Username       string `json:"username"`
	HashedPassword []byte `json:"hashed_password"`
	Role           Role   `json:"role"`
}

type UserStore interface {
	Get(username string) (*User, error)
	Store(user *User) error
	Delete(username string) error
}

func (u *User) ValidatePassword(password string) error {
	return bcrypt.CompareHashAndPassword(u.HashedPassword, []byte(password))
}

func (u *User) SetPassword(password string) error {
	hashed, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	if err != nil {
		return err
	}
	u.HashedPassword = hashed
	return nil
}