class ZipdownController < ApplicationController
  SAVE_FOLDER = "#{Rails.root}/files"
  OUTPUT_FOLDER = "#{Rails.root}/tmp/archiveZip"

  def assort
    obj_class = params[:obj_class]
    obj_id = params[:obj_id]
    obj = obj_class.constantize.find(obj_id)
    zipfile = nil
    case obj.class.to_s.to_sym
      when :Bid
        zipfile = zip_bid obj
      else
        logger.error "[ZipDown#assort] ===> #{obj.class.to_s.to_sym} unKown !!"
    end
    send_file zipfile, :filename => obj.name, :type => detect_content_type(zipfile) if zipfile

  #rescue NameError, ActiveRecord::RecordNotFound => e
    #logger.error "[ZipDown] ===> #{e}"
    #@error = e
  end

  private

  def zip_bid(bid)
    # Todo: User Access Controll

    homeattaches = bid.homeworks
    # 得到每一个人所有文件打包的zip文件
    # 并将每一个人的zip打包为一个并返回路径
    user_zip_paths = homeattaches.map do |homeattach|
      zip_homework_by_user homeattach
    end
    zipping "#{Time.now.to_i}_#{bid.name}.zip", user_zip_paths, OUTPUT_FOLDER

    #@paths = homeworks_attach_path
    #zipfile = ziping homeworks_attach_path
    #send_file zipfile, :filename => bid.name,
    #          :type => detect_content_type(zipfile)
    #rescue Errno::ENOENT => e
    #  logger.error "[Errno::ENOENT] ===> #{e}"
    #  @error = e
  end

  def zip_homework_by_user(homeattach)
    homeworks_attach_path = []
    # 需要将所有homework.attachments遍历加入zip
    # 并且返回zip路径
    user_attaches_paths = homeattach.attachments.each do |attach|
      #length = attach.storage_path.length
      homeworks_attach_path << attach.diskfile#.to_s.slice((length+1)..-1)
    end
    zipping "#{Time.now.to_i}_#{homeattach.user.name.to_s}.zip", homeworks_attach_path, OUTPUT_FOLDER, true
  end


  def zipping(zip_name_refer, files_paths, output_path, is_attachment=false)
    # 输入待打包的文件列表，已经打包文件定位到ouput_path
    ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
    input_filename = files_paths

		rename_zipfile = zip_name_refer ||= "archive_#{Time.now.to_i}.zip"
    zipfile_name = "#{output_path}/#{rename_zipfile}"

    Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))

		Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
			input_filename.each do |filename|
				rename_file = Time.now.to_i.to_s+ ic.iconv( (File.basename(filename)) ).to_s
				rename_file = ic.iconv( filename_to_real( File.basename(filename))).to_s if is_attachment

				zipfile.add(rename_file, filename)
			end
			zipfile.get_output_stream('ReadMe') do |os|
        os.write 'Homeworks'
      end
    end
    zipfile_name
  rescue Errno => e
    logger.error "[zipdown#zipping] ===> #{e}"
    @error = e
  end

  #def ziping files_path
  #  ic = Iconv.new('GBK//IGNORE', 'UTF-8//IGNORE')
  #  folder = SaveFolder
  #  input_filename = files_path
  #  zipfile_name = "#{OutputFolder}/archive_#{Time.now.to_i}.zip"
  #
  #  Dir.mkdir(File.dirname(zipfile_name)) unless File.exist?(File.dirname(zipfile_name))
  #  Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  #    input_filename.each do |filename|
  #      zipfile.add(ic.iconv(filename_to_real(File.basename(filename))), folder + '/' + filename)
  #    end
  #    zipfile.get_output_stream("ReadMe") { |os|
  #      os.write "Homeworks"
  #    }
  #  end
  #  zipfile_name
  #rescue Errno => e
  #  logger.error "[zipdown#zipping] ===> #{e}"
  #  @error = e
  #end

  def detect_content_type(name)
    content_type = Redmine::MimeType.of(name)
    content_type.to_s
  end

  def filename_to_real(name)
    attach = Attachment.find_by_disk_filename(name)
    attach.filename
  end

end
