Darkswarm.factory "EnterpriseRegistrationService", ($http, RegistrationService, EnterpriseImageService, CurrentUser, spreeApiKey, Loading, availableCountries, enterpriseAttributes) ->
  new class EnterpriseRegistrationService
    enterprise:
      user_ids: [CurrentUser.id]
      email_address: CurrentUser.email
      address: {}
      country: availableCountries[0]

    constructor: ->
      for key, value of enterpriseAttributes
        @enterprise[key] = value

    # Creates the enterprise and redirects to the about step on success.
    #
    # @param callback [Function] executed at the end of the operation both in
    #   case of success or failure.
    create: (callback) =>
      Loading.message = t('creating') + " " + @enterprise.name
      $http(
        method: "POST"
        url: "/api/enterprises"
        data:
          enterprise: @prepare()
        params:
          token: spreeApiKey
      ).success((data) =>
        Loading.clear()
        @enterprise.id = data
        EnterpriseImageService.configure(@enterprise)
        RegistrationService.select('about')
      ).error((data) =>
        Loading.clear()
        if data?.errors?
          errors = ("#{k.capitalize()} #{v[0]}" for k, v of data.errors when v.length > 0)
          alert t('failed_to_create_enterprise') + "\n" + errors.join('\n')
        else
          alert(t('failed_to_create_enterprise_unknown'))
      )
      callback.call() if callback?

    update: (step) =>
      Loading.message = t('updating') + " " + @enterprise.name
      $http(
        method: "PUT"
        url: "/api/enterprises/#{@enterprise.id}"
        data:
          enterprise: @prepare()
        params:
          token: spreeApiKey
      ).success((data) ->
        Loading.clear()
        RegistrationService.select(step)
      ).error((data) ->
        Loading.clear()
        alert(t('failed_to_update_enterprise_unknown'))
      )

    prepare: =>
      enterprise = {}
      excluded = [ 'address', 'country', 'id' ]
      for key, value of @enterprise when key not in excluded
        enterprise[key] = value
      enterprise.address_attributes = @enterprise.address if @enterprise.address?
      enterprise.address_attributes.country_id = @enterprise.country.id if @enterprise.country?
      enterprise
