#include "Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.h"
#include "Swiften/Parser/PayloadParsers/SecurityLabelParserFactory.h"
#include "Swiften/Parser/PayloadParsers/SecurityLabelParser.h"

namespace Swift {

SecurityLabelsCatalogParser::SecurityLabelsCatalogParser() : level_(TopLevel), labelParser_(0) {
  labelParserFactory_ = new SecurityLabelParserFactory();
}

SecurityLabelsCatalogParser::~SecurityLabelsCatalogParser() {
  delete labelParserFactory_;
}

void SecurityLabelsCatalogParser::handleStartElement(const String& element, const String& ns, const AttributeMap& attributes) {
	++level_;
	if (level_ == PayloadLevel) {
    getPayloadInternal()->setTo(JID(attributes.getAttribute("to")));
    getPayloadInternal()->setName(attributes.getAttribute("name"));
    getPayloadInternal()->setDescription(attributes.getAttribute("desc"));
  }
  else if (level_ == LabelLevel) {
    assert(!labelParser_);
    if (labelParserFactory_->canParse(element, ns, attributes)) {
      labelParser_ = dynamic_cast<SecurityLabelParser*>(labelParserFactory_->createPayloadParser());
      assert(labelParser_);
    }
  }

  if (labelParser_) {
    labelParser_->handleStartElement(element, ns, attributes);
  }
}

void SecurityLabelsCatalogParser::handleEndElement(const String& element, const String& ns) {
  if (labelParser_) {
    labelParser_->handleEndElement(element, ns);
  }
  if (level_ == LabelLevel && labelParser_) {
    SecurityLabel* label = dynamic_cast<SecurityLabel*>(labelParser_->getPayload().get());
    assert(label);
    getPayloadInternal()->addLabel(SecurityLabel(*label));
    delete labelParser_;
    labelParser_ = 0;
  }
	--level_;
}

void SecurityLabelsCatalogParser::handleCharacterData(const String& data) {
	if (labelParser_) {
		labelParser_->handleCharacterData(data);
	}
}

}