# frozen_string_literal: true

# helpers for managing users with special roles
class UserService
  def self.create_partner(params)
    generated_password = Devise.friendly_token.first(8)
    group_id = Group.first.id
    user = User.new(
      email: params[:email],
      username: "#{params[:first_name]}#{params[:last_name]}".parameterize,
      password: generated_password,
      password_confirmation: generated_password,
      group_id: group_id
    )
    user.build_profile(
      first_name: params[:first_name],
      last_name: params[:last_name],
      phone: '0000000000'
    )
    user.build_statistic_profile(
      gender: true,
      birthday: DateTime.current
    )

    saved = user.save
    if saved
      user.remove_role :member
      user.add_role :partner
    end
    { saved: saved, user: user }
  end

  def self.create_admin(params)
    generated_password = Devise.friendly_token.first(8)
    admin = User.new(params.merge(password: generated_password))
    admin.send :set_slug

    # we associate the admin group to prevent linking any other 'normal' group (which won't be deletable afterwards)
    admin.group = Group.find_by(slug: 'admins')

    # if the authentication is made through an SSO, generate a migration token
    admin.generate_auth_migration_token unless AuthProvider.active.providable_type == DatabaseProvider.name

    saved = admin.save
    if saved
      admin.send_confirmation_instructions
      admin.add_role(:admin)
      admin.remove_role(:member)
      UsersMailer.delay.notify_user_account_created(admin, generated_password)
    end
    { saved: saved, user: admin }
  end

  def self.create_manager(params)
    generated_password = Devise.friendly_token.first(8)
    manager = User.new(params.merge(password: generated_password))
    manager.send :set_slug

    saved = manager.save
    if saved
      manager.send_confirmation_instructions
      manager.add_role(:manager)
      manager.remove_role(:member)
      UsersMailer.delay.notify_user_account_created(manager, generated_password)
    end
    { saved: saved, user: manager }
  end
end
