# frozen_string_literal: true

class AccountBuilder
  include CustomExceptions::Account

  def initialize(params)
    @account_name = params[:account_name]
    @email = params[:email]
  end

  def perform
    validate_email
    validate_user
    ActiveRecord::Base.transaction do
      @account = create_account
      @user = create_and_link_user
    end
  rescue StandardError => e
    @account&.destroy
    puts e.inspect
    raise e
  end

  private

  def validate_email
    address = ValidEmail2::Address.new(@email)
    if address.valid? # && !address.disposable?
      true
    else
      raise InvalidEmail.new(valid: address.valid?) # , disposable: address.disposable?})
    end
  end

  def validate_user
    if User.exists?(email: @email)
      raise UserExists.new(email: @email)
    else
      true
    end
  end

  def create_account
    @account = Account.create!(name: @account_name)
  end

  def create_and_link_user
    password = Time.now.to_i
    @user = @account.users.new(email: @email,
                               password: password,
                               password_confirmation: password,
                               role: User.roles['administrator'],
                               name: email_to_name(@email))
    if @user.save!
      @user
    else
      raise UserErrors.new(errors: @user.errors)
    end
  end

  def email_to_name(email)
    name = email[/[^@]+/]
    name.split('.').map(&:capitalize).join(' ')
  end
end
