module Noah
  class Watcher < Model
    include WatcherValidations

    attribute :pattern
    attribute :endpoint
    attribute :name

    index :pattern
    index :endpoint

    def validate
      super
      assert_present :endpoint
      assert_present :pattern
      assert_unique [:endpoint, :pattern]
      assert_not_superset
      assert_not_subset
    end

    def name
      @name = Base64.encode64("#{pattern}|#{endpoint}").gsub("\n","")
    end

    def to_hash
      h = {:pattern => pattern, :name => name, :endpoint => endpoint, :created_at => created_at, :updated_at => updated_at}
      super.merge(h)
    end

    class << self
    def find_by_name(name)
      pattern, endpoint = Base64.decode64(name).split('|')
      find(:pattern => pattern, :endpoint => endpoint).first
    end

    def watch_list
      arr = []
      watches = self.all.sort_by(:pattern)
      watches.each {|w| arr << w.to_hash}
      arr
    end
    end

    private
    # Not sure about these next two.
    # Could get around patterns changing due to namespace changes
    def path_to_pattern
    end

    def pattern_to_path
    end
  end

  class Watchers
    @@agents = []
    def self.all(options = {})
      options.empty? ? Watcher.all.sort : Watcher.find(options).sort
    end

    def self.register_agent(agent_class)
      @@agents << agent_class
    end

    def self.agents
      @@agents
    end
  end
end
