module CSVHandlers
  def create_row(row, headers, encoding = nil)
    values = []
    headers.each do |header|
      if encoding
        values << row[header].encode(encoding) if row[header]
      else
        values << row[header]
      end
    end
    CSV::Row.new(headers, values)
  end

  def append_to_csv(file, row)
    tries = 10
    begin
      f = CSV.open(file, "a+", headers: row.headers, force_quotes: true)
      f << row
      f.close
    rescue
      tries -= 1
      if tries > 0
        retry
      else
        puts "Unable to write to file #{file}"
        puts "Make sure the file exists and is not open in any other programs and try again. If that does not work try restarting your computer, or restarting the project with the -r flag."
        exit
      end
    end
  end

  def create_file(f)
    unless File.exist?(f)
      FileUtils.touch(f)
      csv = CSV.open(f, "w+")
      csv << @headers.collect {|x| x && x.encode('utf-8')}
      csv.close
    end
  end

  def create_file_with_headers(f, headers)
    unless File.exist?(f)
      FileUtils.touch(f)
      csv = CSV.open(f, "w+")
      csv << headers.collect {|x| x && x.encode('utf-8')}
      csv.close
    end
  end

  def get_headers(file)
    CSV.open(file, headers: true, return_headers: true).shift.headers
  end
end
