package users

import (
	"context"
	"encoding/base64"
	"golang.org/x/crypto/bcrypt"
	"lmika.dev/lmika/hugo-cms/models"
	"lmika.dev/lmika/hugo-cms/providers/db"
	"log"
)

type Service struct {
	dbp *db.DB
}

func NewService(dbp *db.DB) *Service {
	return &Service{
		dbp: dbp,
	}
}

func (s *Service) AddUser(ctx context.Context, newUser NewUser) (models.User, error) {
	passwd, err := bcrypt.GenerateFromPassword([]byte(newUser.Password), bcrypt.DefaultCost)
	if err != nil {
		return models.User{}, err
	}

	user := models.User{
		Email:        newUser.Email,
		PasswordHash: base64.StdEncoding.EncodeToString(passwd),
	}
	if err := s.dbp.AddUser(ctx, &user); err != nil {
		return models.User{}, err
	}

	return user, nil
}

func (s *Service) GetUserByID(ctx context.Context, id int64) (models.User, error) {
	return s.dbp.GetUserByID(ctx, id)
}

func (s *Service) VerifyLogin(ctx context.Context, email string, password string) (models.User, error) {
	user, err := s.dbp.GetUserByEmail(ctx, email)
	if err != nil {
		log.Println("User not found")
		return models.User{}, err
	}

	pwdHash, err := base64.StdEncoding.DecodeString(user.PasswordHash)
	if err != nil {
		return models.User{}, err
	}

	err = bcrypt.CompareHashAndPassword(pwdHash, []byte(password))
	if err != nil {
		log.Println("Password incorrect")
		return models.User{}, err
	}

	return user, nil
}

func (s *Service) GetUserByEmail(ctx context.Context, email string) (models.User, error) {
	user, err := s.dbp.GetUserByEmail(ctx, email)
	if err != nil {
		return models.User{}, err
	}

	return user, nil
}

type NewUser struct {
	Email    string `json:"email"`
	Password string `json:"password"`
}