package entity

import (
	"fmt"

	"github.com/jinzhu/gorm"

	"github.com/photoprism/photoprism/internal/form"
	"github.com/photoprism/photoprism/pkg/clean"
)

// AddUser creates a new user record and sets the password in a single transaction.
func AddUser(frm form.User) error {
	user := NewUser().SetFormValues(frm)

	if len(frm.Password) < PasswordLength {
		return fmt.Errorf("password must have at least %d characters", PasswordLength)
	}

	if err := user.Validate(); err != nil {
		return err
	}

	return Db().Transaction(func(tx *gorm.DB) error {
		if err := tx.Create(user).Error; err != nil {
			return err
		}

		pw := NewPassword(user.UserUID, frm.Password)

		if err := tx.Create(&pw).Error; err != nil {
			return err
		}

		log.Infof("successfully added user %s", clean.LogQuote(user.Name()))

		return nil
	})
}
