wb = xlsx_package.workbook

bold = wb.styles.add_style :b => true
header = wb.styles.add_style :b => true, :bg_color => Stylesheet.primary.upcase.gsub('#', 'FF'), :fg_color => 'FFFFFFFF'
date = wb.styles.add_style :format_code => Rails.application.secrets.excel_date_format

wb.add_worksheet(name: @index.label) do |sheet|
  ## heading stats for the current page
  sheet.add_row [t('export.entries'), @results['hits']['total']], :style => [bold, nil], :types => [:string, :integer]
  if @index.ca
    sheet.add_row [t('export.revenue'), @results['aggregations']['total_ca']['value']], :style => [bold, nil], :types => [:string, :float]
  end
  sheet.add_row [t('export.average_age'), @results['aggregations']['average_age']['value']], :style => [bold, nil], :types => [:string, :float]
  unless @type.simple
    sheet.add_row ["#{t('export.total')} #{@type.label}", @results['aggregations']['total_stat']['value']], :style => [bold, nil], :types => [:string, :integer]
  end
  sheet.add_row []

  ## data table
  # heading labels
  columns = [t('export.date'), t('export.user'), t('export.email'), t('export.phone'), t('export.gender'), t('export.age'), t('export.type')]
  columns.push @type.label unless @type.simple
  @fields.each do |f|
    columns.push f.label
  end
  columns.push t('export.revenue') if @index.ca
  sheet.add_row columns, :style => header

  # data rows
  @results['hits']['hits'].each do |hit|
    user = get_item(@users, hit['_source']['userId'])
    subtype = get_item(@subtypes, hit['_source']['subType'], 'key')
    data = [
        Date::strptime(hit['_source']['date'],'%Y-%m-%d'),
        (user ? user.profile.full_name : "ID #{hit['_source']['userId']}"),
        (user ? user.email : ''),
        (user ? user.profile.phone : ''),
        t("export.#{hit['_source']['gender']}"),
        hit['_source']['age'],
        subtype.nil? ? "" : subtype.label
    ]
    styles = [date, nil, nil, nil, nil, nil, nil]
    types = [:date, :string, :string, :string, :string, :integer, :string]
    unless @type.simple
      data.push hit['_source']['stat']
      styles.push nil
      types.push :string
    end
    @fields.each do |f|
      field_data = hit['_source'][f.key]
      case f.data_type
        when 'date'
          data.push Date::strptime(field_data, '%Y-%m-%d')
          styles.push date
          types.push :date
        when 'list'
          data.push field_data.map{|e| e['name'] }.join(', ')
          styles.push nil
          types.push :string
        when 'number'
          data.push field_data
          styles.push nil
          types.push :float
        else
          data.push field_data
          styles.push nil
          types.push :string
      end

    end
    if @index.ca
      data.push hit['_source']['ca']
      styles.push nil
      types.push :float
    end

    sheet.add_row data, :style =>  styles, :types => types
  end
end