module Support
  class UsersCollection
    attr_reader :workstation_user, :oa_user

    FRONTEND_TO_LABEL = {
      distribution: %i[workstation label_7123],
      sales_sheets: %i[oa technology_manager],
      reporting: %i[workstation react_homepage_flow_15063],
      accounting: %i[workstation label_7482],
      accounting_d3: %i[workstation label_18805],
      accounting_sub: %i[workstation subaccount_13823],
      source_of_streams: %i[workstation e2e_6971],
      audience_page: %i[workstation e2e_6971],
      conflict_manager: %i[workstation label_18805],
      video: %i[workstation label_16156],
      users: %i[workstation d3_16055],
      workstation_spa: %i[workstation react_homepage_flow_15063]
    }.freeze

    def record_workstation_user(name:, user_data:)
      @workstation_user = User.new(
        name: name,
        domain: :workstation,
        user_data: user_data
      )
      Helpers::ScenarioVariables.add_scenario_variable("Workstation user: ", @workstation_user.info)
    end

    def workstation_user_data
      @workstation_user.info
    rescue NoMethodError
      puts "No workstation user recorded"
    end

    def record_oa_user(name:, user_data:)
      @oa_user = User.new(
        name: name,
        domain: :oa,
        user_data: user_data
      )
      Helpers::ScenarioVariables.add_scenario_variable("OA user: ", @oa_user.info)
    end

    def oa_user_data
      @oa_user.info
    rescue NoMethodError
      puts "No oa user recorded"
    end

    def distribution_user_data
      distribution_user.info
    end

    def accounting_user_data(user_type = :accounting)
      accounting_user(user_type).info
    end

    def distribution_user
      # the presence of a workstation user means we aren't running against
      # standalone environments, so the distribution user is the same as the
      # workstation user.
      return @workstation_user if @workstation_user

      @distribution_user ||= User.new standalone_user_args(:distribution)
    end

    def reporting_user
      # the presence of a workstation user means we aren't running against
      # standalone environments, so the reporting user is the same as the
      # workstation user.
      return @workstation_user if @workstation_user

      @reporting_user ||= User.new standalone_user_args(:reporting)
    end

    def sales_sheets_user
      @sales_sheets_user ||= User.new standalone_user_args(:sales_sheets)
    end

    def source_of_streams_user
      @source_of_streams_user ||= User.new standalone_user_args(:source_of_streams)
    end

    def audience_page_user
      @audience_page_user ||= User.new standalone_user_args(:audience_page)
    end

    def accounting_user(user_type = :accounting)
      return @workstation_user if @workstation_user
      User.new standalone_user_args(user_type.to_sym)
    end

    def conflict_manager_user
      @conflict_manager_user ||= User.new standalone_user_args(:conflict_manager)
    end

    def video_user
      @video_user ||= User.new standalone_user_args(:video)
    end

    def users_user
      @users_user ||= User.new standalone_user_args(:users)
    end

    def workstation_spa_user
      @users_user ||= User.new standalone_user_args(:workstation_spa)
    end

    private

    def standalone_user_args(frontend_name)
      domain, user_name = FRONTEND_TO_LABEL[frontend_name] || fail("unknown frontend: '#{frontend_name}'!")
      {
        name: user_name, domain: domain,
        user_data: DataHelpers::UserConfig.lookup(domain, user_name)
      }
    end
  end
end
