module.exports =
class Watcher
  @watchedPaths: {}

  @setup: ->
    if not OSX.__AAWatcher__
      OSX.__AAWatcher__ = OSX.JSCocoa.createClass_parentClass "__AAWatcher__", "NSObject"
      OSX.JSCocoa.addInstanceMethod_class_jsFunction_encoding "watcher:receivedNotification:forPath:", OSX.__AAWatcher__, @watcher_receivedNotification_forPath, "v:@@@@"

    @delegate = OSX.__AAWatcher__.alloc.init
    @queue = OSX.UKKQueue.alloc.init
    @queue.setDelegate @delegate

  @watch: (path, callback) ->
    @setup() unless @queue?

    path = OSX.NSString.stringWithString(path).stringByStandardizingPath
    @queue.addPath path if not @watchedPaths[path]

    (@watchedPaths[path] ?= []).push callback

    callback # Handy for anonymous functions.

  @unwatch: (path, callback=null) ->
    return unless @watchedPaths[path]

    @watchedPaths[path] = (item for item in @watchedPaths[path] when item != callback)
    if not callback? or @watchedPaths[path].length == 0
      @watchedPaths[path] = null
      console.log "Unwatch #{path}"
      @queue.removePathFromQueue path

  # Delegate method for __AAWatcher__
  @watcher_receivedNotification_forPath = (queue, notification, path) =>
    callbacks = @watchedPaths[path] ? []

    switch notification.toString()
      when "UKKQueueFileRenamedNotification"
        throw "Doesn't handle this yet"
      when "UKKQueueFileDeletedNotification"
        @watchedPaths[path] = null
        @queue.removePathFromQueue path
        callback notification, path, callback for callback in callbacks
      when "UKKQueueFileWrittenToNotification"
        callback notification, path, callback for callback in callbacks
      when "UKKQueueFileAttributesChangedNotification"
        # Just ignore this
        console.log "Attribute Changed on #{path}"
      else
        console.error "I HAVE NO IDEA WHY #{notification} WAS TRIGGERED ON #{path}"
