#include "lrpreparedpages.h"

#include "serializators/lrxmlreader.h"
#include "serializators/lrxmlwriter.h"

namespace LimeReport {

bool PreparedPages::loadFromFile(const QString &fileName)
{
    ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName);
    return readPages(reader);
}

bool PreparedPages::loadFromString(const QString data)
{
    ItemsReaderIntf::Ptr reader = StringXMLreader::create(data);
    return readPages(reader);
}

bool PreparedPages::loadFromByteArray(QByteArray *data)
{
    ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data);
    return readPages(reader);
}

bool PreparedPages::saveToFile(const QString &fileName)
{
    if (!fileName.isEmpty()){
        QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
        foreach (PageItemDesignIntf::Ptr page, *m_pages){
            writer->putItem(page.data());
        }
        return writer->saveToFile(fileName);
    }
    return false;
}

QString PreparedPages::saveToString()
{
    QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
    foreach (PageItemDesignIntf::Ptr page, *m_pages){
        writer->putItem(page.data());
    }
    return writer->saveToString();
}

QByteArray PreparedPages::saveToByteArray()
{
    QScopedPointer< ItemsWriterIntf > writer(new XMLWriter());
    foreach (PageItemDesignIntf::Ptr page, *m_pages){
        writer->putItem(page.data());
    }
    return writer->saveToByteArray();
}

void PreparedPages::clear()
{
    m_pages->clear();
}

bool PreparedPages::readPages(ItemsReaderIntf::Ptr reader)
{
    clear();
    if (reader->first()){
        PageItemDesignIntf::Ptr page = PageItemDesignIntf::create(0);
        if (!reader->readItem(page.data()))
            return false;
        else {
            m_pages->append(page);
            while (reader->next()){
                page = PageItemDesignIntf::create(0);
                if (!reader->readItem(page.data())){
                    m_pages->clear();
                    return false;
                } else {
                    m_pages->append(page);
                }
            }
        }

        return true;
    }
    return false;
}

}