package user

import "errors"

type IDService interface {
	VerifyID(id string) error
}

type NewUser struct {
	Username string
	Password string

	IDNumber string
}

type UserRepository interface {
	CheckUsername(username string) error
	SaveUser(newUser NewUser) error
}

type UserService struct {
	IDService IDService
	Users UserRepository
}

func (s UserService) RegisterUser(newUser NewUser) error {
	// Business validation
	if newUser.Username == "" || newUser.Password == "" {
		errors.New("username or password is empty")
	}

	// Validate there is no such username
	if err := s.Users.CheckUsername(newUser.Username); err != nil {
		return err
	}

	// Call an external (government?) service to verify the ID number
	if err := s.IDService.VerifyID(newUser.IDNumber); err != nil {
		return err
	}

	// Save the user in the persistent store
	if err := s.Users.SaveUser(newUser); err != nil {
		return err
	}

	return nil
}