module AutoWizard

=begin

check if auto wizard is enabled

  AutoWizard.enabled?

returns

  true | false

=end

  def self.enabled?
    auto_wizard_file_location = file_location
    return false if !File.file?(auto_wizard_file_location)
    true
  end

=begin

get auto wizard data

  AutoWizard.data

returns

  content of auto wizard file as object

=end

  def self.data
    auto_wizard_file_location = file_location
    fail "So such file #{auto_wizard_file_location}" if !File.file?(auto_wizard_file_location)
    JSON.parse( File.read(auto_wizard_file_location) )
  end

=begin

creates or updates Users, EmailAddresses and sets Settings based on the 'auto_wizard.json' file placed in the root directory.

there is an example file 'contrib/auto_wizard_example.json'

  AutoWizard.setup

returns

  the first created User if a 'auto_wizard.json' file was found and processed, containing at least one entry in Users

  the User with id 1 (NULL) if a 'auto_wizard.json' file was found and processed, containing no Users

  nil if no 'auto_wizard.json' file was found

=end

  def self.setup
    auto_wizard_file_location = file_location

    auto_wizard_hash = data

    admin_user = User.find(1)

    UserInfo.current_user_id = admin_user.id

    # set Settings
    if auto_wizard_hash['Settings']
      auto_wizard_hash['Settings'].each { |setting_data|
        Setting.set( setting_data['name'], setting_data['value'] )
      }
    end

    # create Organizations
    if auto_wizard_hash['Organizations']
      auto_wizard_hash['Organizations'].each { |organization_data|
        Organization.create_or_update(organization_data.symbolize_keys)
      }
    end

    # create Users
    if auto_wizard_hash['Users']

      roles  = Role.where( name: %w(Agent Admin) )
      groups = Group.all

      auto_wizard_hash['Users'].each { |user_data|

        # lookup organization
        if user_data['organization'] && !user_data['organization'].empty?
          organization = Organization.find_by(name: user_data['organization'])
          if organization
            user_data['organization_id'] = organization.id
          end
        end
        user_data.delete('organization')

        user_data_symbolized = user_data.symbolize_keys.merge(
          {
            active: true,
            roles: roles,
            groups: groups,
          }
        )
        created_user = User.create_or_update(user_data_symbolized)

        # use first created user as admin
        next if admin_user.id != 1

        admin_user = created_user
        UserInfo.current_user_id = admin_user.id

        # fetch org logo
        if admin_user.email
          Service::Image.organization_suggest(admin_user.email)
        end
      }
    end

    # create EmailAddresses/Channels/Signatures
    model_map = {
      'Channels'       => 'Channel',
      'EmailAddresses' => 'EmailAddress',
      'Signatures'     => 'Signature',
    }
    model_map.each {|map_name, model|
      next if !auto_wizard_hash[map_name]
      auto_wizard_hash[map_name].each {|data|
        if data['id'] || data['name']
          Kernel.const_get(model).create_or_update(data.symbolize_keys)
        else
          Kernel.const_get(model).create(data.symbolize_keys)
        end
      }
    }

    # remove auto wizard file
    FileUtils.rm auto_wizard_file_location

    admin_user
  end

  private

  def self.file_location
    auto_wizard_file_name     = 'auto_wizard.json'
    auto_wizard_file_location = "#{Rails.root}/#{auto_wizard_file_name}"
    auto_wizard_file_location
  end
end
