# frozen_string_literal: true

require 'rails_helper'
require 'zip'

describe RepositoryZipExport, type: :background_job do
  let(:user) { create :user }
  let(:team) { create :team, created_by: user }
  let!(:owner_role) { UserRole.find_by(name: I18n.t('user_roles.predefined.owner')) }
  let!(:team_assignment) { create_user_assignment(team, owner_role, user) }
  let(:repository) { create :repository, team: team, created_by: user }
  let!(:sample_group_column) do
    create :repository_column, repository: repository,
                               created_by: user,
                               name: 'Sample group',
                               data_type: 'RepositoryListValue'
  end
  let!(:repository_list_item) do
    create :repository_list_item, data: 'item one', repository_column: sample_group_column
  end
  let!(:custom_column) do
    create :repository_column, repository: repository,
                               created_by: user,
                               name: 'Custom items',
                               data_type: 'RepositoryTextValue'
  end

  before do
    @row_ids = []
    10.times do |index|
      row = create :repository_row, name: "row #{index}",
                                    repository: repository,
                                    created_by: user,
                                    last_modified_by: user
      create :repository_list_value, repository_list_item: repository_list_item,
                                     repository_cell_attributes: {
                                       repository_row: row,
                                       repository_column: sample_group_column
                                     }
      create :repository_text_value, data: 'custum column value',
                                     repository_cell_attributes: {
                                       repository_row: row,
                                       repository_column: custom_column
                                     }

      @row_ids << row.id.to_s
    end
  end

  describe '#generate_zip/2' do
    let(:params) do
      { header_ids: ['-1',
                     '-2',
                     sample_group_column.id.to_s,
                     custom_column.id.to_s,
                     '-3',
                     '-5',
                     '-4'],
        row_ids: @row_ids }
    end

    it 'generates a new zip export object' do
      ZipExport.skip_callback(:create, :after, :self_destruct)
      RepositoryZipExport.generate_zip(params, repository, user)
      expect(ZipExport.count).to eq 1
      ZipExport.set_callback(:create, :after, :self_destruct)
    end

    it 'generates a zip with csv file with exported rows' do
      ZipExport.skip_callback(:create, :after, :self_destruct)
      RepositoryZipExport.generate_zip(params, repository, user)
      csv_zip_file = ZipExport.first.zip_file
      file_path = ActiveStorage::Blob.service.public_send(:path_for, csv_zip_file.key)
      parsed_csv_content = Zip::File.open(file_path) do |zip_file|
        csv_file = zip_file.glob('*.csv').first
        csv_content = csv_file.get_input_stream.read
        CSV.parse(csv_content, headers: true)
      end
      index = 0

      parsed_csv_content.each do |row|
        row_hash = row.to_h
        expect(row_hash.fetch('Sample group')).to eq 'item one'
        expect(row_hash.fetch('Custom items')).to eq 'custum column value'
        expect(row_hash.fetch('Name')).to eq "row #{index}"
        index += 1
      end
      ZipExport.set_callback(:create, :after, :self_destruct)
    end
  end
end