#!/usr/bin/env ruby

require 'json'

order = ARGV[0] # modified, modified_reverse, added, added_reverse
query = ARGV[1]
abort 'You need to specify an order type.' if ARGV[0].empty?

downloads_dir = ENV['downloads_dir'].nil? || ENV['downloads_dir'].empty? ? "#{ENV['HOME']}/Downloads" : "#{ENV['HOME']}/#{ENV['downloads_dir']}"
all_entries = Dir.glob("#{downloads_dir}/*")
script_filter_items = []

if order =~ /modified.*/
  entries = all_entries.sort_by(&File.method(:mtime))
elsif order =~ /added.*/
  entries_cache_file = "#{ENV['alfred_workflow_cache']}/added_cache.txt"
  entries_check_file = "#{ENV['alfred_workflow_cache']}/added_check.txt"

  entries_check_old = File.read(entries_check_file) rescue ''
  entries_check_new = File.mtime(downloads_dir)

  if entries_check_old != entries_check_new
    require 'open3'
    entries_by_added = Open3.capture2('mdls', '-name', 'kMDItemFSName', '-name', 'kMDItemDateAdded', '-raw', *all_entries).first.split("\0").each_slice(2).sort.map { |a| "#{downloads_dir}/#{a[1]}" }

    Dir.mkdir(ENV['alfred_workflow_cache']) unless Dir.exist?(ENV['alfred_workflow_cache'])
    File.write(entries_cache_file, entries_by_added.join("\n"))
    File.write(entries_check_file, File.mtime(downloads_dir))
  end

  entries = File.read(entries_cache_file).split("\n")
else
  abort 'Unrecognised order type.'
end

entries.reverse! if order =~ /.+_reverse/
filtered_entries = entries.select { |e| e.match(/#{query}/i) }

filtered_entries.each do |entry|
  name = File.directory?(entry) ? File.basename(entry) : File.basename(entry, File.extname(entry))
  script_filter_items.push(type: 'file', title: name, subtitle: entry, icon: { path: entry, type: 'fileicon' }, arg: entry)
end

puts({ items: script_filter_items }.to_json)
