#ifndef LREXCELEXPORTER_H
#define LREXCELEXPORTER_H

#include <QSet>
#include <QtXml>
#include "lrexporterintf.h"

namespace LimeReport{

struct GridItem{
    BaseDesignIntf* item;
    long    endRow;
    long    endColumn;
public:
    GridItem(BaseDesignIntf* item, long endRow, long endColumn);
};

class HTMLDocument{
public:
    HTMLDocument();
    bool saveAs(const QString& fileName);
    QDomElement* header(){return &m_header;}
    QDomElement* body(){return &m_body;}
    QDomNode* table(){return &m_table;}
    QDomElement createElement(const QString& name);
    void initGrid(QSet<qreal>columns, QSet<qreal>rows);
    void write(int startRow, int startColumn, int endRow, int endColumn, BaseDesignIntf *item);
private:
    void preapareHTML();
private:
    QDomDocument m_htmlDocument;
    QDomElement m_header;
    QDomElement m_body;
    QDomNode m_table;
    QList<GridItem> m_items;
    QVector<QVector<GridItem*>> m_grid;
};

struct Grid{
    QSet<qreal> x;
    QSet<qreal> y;
};

class HTMLExporter : public QObject, public ReportExporterInterface{
    Q_OBJECT
public:
    HTMLExporter(QObject *parent = 0);
    // IReportExporter interface
    QString exporterName();
    QString exporterFileExt();
    QString hint();
    bool exportPages(ReportPages pages, const QString& fileName, const QMap<QString, QVariant>& params = QMap<QString, QVariant>());
private:
    void buildGrid(Grid* grid, BaseDesignIntf* item);
    void exportItem(BaseDesignIntf* item);
    void createItemCell(BaseDesignIntf* item);
    int cellStartColumnIndex(BaseDesignIntf* item);
    int cellEndColumnIndex(BaseDesignIntf* item);
    int cellStartRowIndex(BaseDesignIntf* item);
    int cellEndRowIndex(BaseDesignIntf* item);
//    QXlsx::Format createTextItemFormat(BaseDesignIntf *item);
private:

    QVector<qreal>x;
    QVector<qreal>y;
    QVector<QString> exportedTypes;

    int m_xOffset;
    int m_yOffset;
    HTMLDocument* m_document;

};

} //namespace LimeReport

#endif // LREXCELEXPORTER_H