# =XMPP4R - XMPP Library for Ruby
# License:: Ruby's license (see the LICENSE file) or GNU GPL, at your option.
# Website::http://home.gna.org/xmpp4r/
#
# For documentation of the return values please see [Jabber::PubSub::ServiceHelper]
# This class is only a wrapper around [Jabber::PubSub::ServiceHelper]
#


require 'xmpp4r/pubsub/helper/servicehelper'
require 'xmpp4r/pubsub/helper/nodebrowser'

module Jabber
  module PubSub
    class NodeHelper < ServiceHelper

      attr_reader :nodename
      attr_reader :name
      attr_reader :jid
      attr_reader :my_subscriptions
      ##
      # creates a new node
      # new(client,service,nodename)
      # stream:: [Jabber::Stream]
      # jid:: [String] (jid of the pubsub service)
      # nodename:: [String]
      def initialize(stream, jid, nodename = nil, create_if_not_exist = true)
        super(stream,jid)
        @nodename = nodename
        @jid = jid
        @stream = stream

        if create_if_not_exist and !node_exist?
          # if no nodename is given a instant node will created
          # (if the service supports instant nodes)
          @nodename = create_node
        else
          get_subscriptions
        end
      end

      ##
      # creates the node
      # create(configuration=nil)
      # configuration:: [Jabber::XData]
      def create_node(configuration = Jabber::PubSub::NodeConfig.new)
        unless node_exist?
          super(@nodename,configuration)
        else
          false
        end
      end

      ##
      # get the configuration of the node
      # get_configuration(configuration=nil)
      # configuration:: [Jabber::XData]
      def get_configuration(subid = nil)
        get_options(@nodename, subid)
      end

      ##
      # set the configuration of the node
      # set_configuration(configuration=nil)
      # configuration:: [Jabber::XData]
      # subid:: [String] default is nil
      def set_configuration(configuration,subid = nil)
        set_options(@nodename, configuration, subid)
      end

      ##
      # deletes the node
      # delete
      def delete_node
        delete(@nodename)
      end

      ##
      # publishing content on this node
      # publish_content(items)
      # items:: [REXML::Element]
      def publish_content(items)
        publish_item_to(@nodename,items)
      end

      ##
      # gets all items from the node
      # get_all_items
      def get_all_items
        get_items_from(@nodename)
      end

      ##
      # get a count of items
      # get_items(count)
      # count:: [Fixnum]
      def get_items(count)
        get_items_from(@nodename,count)
      end

      ##
      # get all node affiliations
      # get_affiliations
      def get_affiliations
        affiliations
      end

      ##
      # get all subscriptions on this node
      # get_subscriptions
      def get_subscriptions
        get_subscriptions_from(@nodename)
      end

      ##
      # get all subscribers subscribed on this node
      # get_subscribers
      def get_subscribers
        @subscriptions = subscribers(@nodename)
      end

      ##
      # subscribe to this node
      # do_subscribe
      def do_subscribe
        subscribe_to(@nodename)
        get_subscriptions
      end

      ##
      # unsubscribe from this node
      # do_unsubscribe(subid = nil)
      # subid:: [String]
      def do_unsubscribe(subid)
        unsubscribe(@nodename,subid)
      end

      ##
      # purge all items from this node
      # purge_items
      def purge_items
        purge(@nodename)
      end

    private

      def node_exist?
        nodebrowser = PubSub::NodeBrowser.new(@stream)
        nodebrowser.nodes(@jid).include?(@nodename)
      end
      def disco_info
      end

    end #class
  end #module
end #module
