/**********************************************************************
 * LeechCraft - modular cross-platform feature rich internet client.
 * Copyright (C) 2006-2014  Georg Rudoy
 *
 * Boost Software License - Version 1.0 - August 17th, 2003
 *
 * Permission is hereby granted, free of charge, to any person or organization
 * obtaining a copy of the software and accompanying documentation covered by
 * this license (the "Software") to use, reproduce, display, distribute,
 * execute, and transmit the Software, and to prepare derivative works of the
 * Software, and to permit third-parties to whom the Software is furnished to
 * do so, all subject to the following:
 *
 * The copyright notices in the Software and this entire statement, including
 * the above license grant, this restriction and the following disclaimer,
 * must be included in all copies of the Software, in whole or in part, and
 * all derivative works of the Software, unless such copies or derivative
 * works are solely in the form of machine-executable object code generated by
 * a source language processor.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
 * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
 * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **********************************************************************/

#include "xmppannotationsiq.h"
#include <QDomElement>

namespace LC
{
namespace Azoth
{
namespace Xoox
{
	const QString NSPrivate = "jabber:iq:private";
	const QString NSRosterNotes = "storage:rosternotes";

	XMPPAnnotationsIq::NoteItem::NoteItem ()
	{
	}

	XMPPAnnotationsIq::NoteItem::NoteItem (const QString& jid, const QString& note)
	: Jid_ (jid)
	, Note_ (note)
	{
	}

	QString XMPPAnnotationsIq::NoteItem::GetJid () const
	{
		return Jid_;
	}

	void XMPPAnnotationsIq::NoteItem::SetJid (const QString& jid)
	{
		Jid_ = jid;
	}

	QString XMPPAnnotationsIq::NoteItem::GetNote () const
	{
		return Note_;
	}

	void XMPPAnnotationsIq::NoteItem::SetNote (const QString& note)
	{
		Note_ = note;
	}

	QDateTime XMPPAnnotationsIq::NoteItem::GetCDate () const
	{
		return CDate_;
	}

	void XMPPAnnotationsIq::NoteItem::SetCDate (const QDateTime& cdate)
	{
		CDate_ = cdate;
	}

	QDateTime XMPPAnnotationsIq::NoteItem::GetMDate () const
	{
		return MDate_;
	}

	void XMPPAnnotationsIq::NoteItem::SetMDate (const QDateTime& mdate)
	{
		MDate_ = mdate;
	}

	XMPPAnnotationsIq::XMPPAnnotationsIq ()
	{
	}

	QList<XMPPAnnotationsIq::NoteItem> XMPPAnnotationsIq::GetItems () const
	{
		return Items_;
	}

	void XMPPAnnotationsIq::SetItems (const QList<NoteItem>& items)
	{
		Items_ = items;
	}

	void XMPPAnnotationsIq::parseElementFromChild (const QDomElement& element)
	{
		const auto& storage = element.firstChildElement ("query").firstChildElement ("storage");
		auto note = storage.firstChildElement ("note");
		while (!note.isNull ())
		{
			NoteItem item (note.attribute ("jid"), note.text ());

			if (note.hasAttribute ("cdate"))
				item.SetCDate (QDateTime::fromString (note.attribute ("cdate"), Qt::ISODate));
			if (note.hasAttribute ("mdate"))
				item.SetMDate (QDateTime::fromString (note.attribute ("mdate"), Qt::ISODate));

			Items_ << item;

			note = note.nextSiblingElement ("note");
		}
	}

	void XMPPAnnotationsIq::toXmlElementFromChild (QXmlStreamWriter *writer) const
	{
		writer->writeStartElement ("query");
		writer->writeAttribute ("xmlns", NSPrivate);
		writer->writeStartElement ("storage");
		writer->writeAttribute ("xmlns", NSRosterNotes);

		for (const auto& item : Items_)
		{
			writer->writeStartElement ("note");
			writer->writeAttribute ("jid", item.GetJid ());

			if (item.GetCDate ().isValid ())
				writer->writeAttribute ("cdate", item.GetCDate ().toString (Qt::ISODate));

			if (item.GetMDate ().isValid ())
				writer->writeAttribute ("mdate", item.GetMDate ().toString (Qt::ISODate));

			writer->writeCharacters (item.GetNote ());
			writer->writeEndElement ();
		}

		writer->writeEndElement ();
		writer->writeEndElement ();
	}
}
}
}
