// readStyle.cpp

#include <QtGlobal>
#include <QtCore>

#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"

QXLSX_USE_NAMESPACE

int readGoogleSpreadsheet();
int readMSExcel201x();
int readMSExcel201xNumber(QXlsx::Document* pXlsx);
int readLibreOffice();
int readWPSOffice();


int readStyle()
{
	int ret;
	
    // ret = readGoogleSpreadsheet();
	
    // ret = readMSExcel201x();

	return 0; 
}

int readGoogleSpreadsheet()
{
	Document xlsx("google-spreadsheet.xlsx"); // google docs 

	if (!xlsx.isLoadPackage())
	{
		qDebug() << "[readGoogleSpreadsheet] failed to load package"; 
		return (-1); 
	}

	// current sheet is default sheet. (Sheet1)

	for (int row = 1; row < 20; ++row)
	{
		Cell* cell = xlsx.cellAt(row, 1);
		if ( cell == NULL )
			continue;
		QVariant var = cell->readValue();
		qint32 styleNo = cell->styleNumber();

		Format fmt = cell->format();
		QString strFormat; 
		if (fmt.hasNumFmtData())
		{
			QString strNumFormat = fmt.numberFormat();
			if ( ! strNumFormat.isEmpty() )
				strFormat = strFormat + QString(" number format : ") + strNumFormat;
		}

		if (fmt.hasFontData() ) 
		{
			Format::FontScript fs = fmt.fontScript(); 
		}

		if (fmt.hasFillData())
		{
			int fillIndex = fmt.fillIndex();
			QByteArray ba = fmt.fillKey();
		}

		if (fmt.hasBorderData())
		{

		}

		if (fmt.hasAlignmentData())
		{

		}

		if (fmt.hasProtectionData())
		{

		}
			
		if ( styleNo >= 0 )
		{
			qDebug() << row << " " << var << " , style:" << styleNo << strFormat;
		}
		else
		{
			qDebug() << row << " " << var << strFormat;
		}
	}

	/* Deug Output 
	1   QVariant(double, 1)  , style: 1 ""
	2   QVariant(QString, "2")  , style: 2 ""
	3   QVariant(double, 3)  , style: 3 ""
	4   QVariant(double, 4)  , style: 4 ""
	5   QVariant(double, 5)  , style: 5 ""
	6   QVariant(double, 6)  , style: 6 " number format : _([$\-412]* #,##0.00_);_([$\-412]* \\(#,##0.00\\);_([$\-412]* \"-\"??_);_(@_)"
	7   QVariant(double, 7)  , style: 7 " number format : #,##0.00;(#,##0.00)"
	8   QVariant(double, 8)  , style: 8 " number format : [$\-412]#,##0.00"
	9   QVariant(double, 9)  , style: 9 " number format : [$\-412]#,##0"
	10   QVariant(QString, "1900. 1. 9")  , style: 10 " number format : yyyy. M. d"
	11   QVariant(QTime, QTime("00:00:00.000"))  , style: 11 " number format : am/pm h:mm:ss"
	12   QVariant(QString, "1900. 1. 11 AM 12:00:00")  , style: 12 " number format : yyyy. M. d am/pm h:mm:ss"
	13   QVariant(QString, "312:0:0")  , style: 13 ""
	*/

	/* Testing fo read google spreadsheet file (made by google docs) 
	 https://github.com/j2doll/QXlsx/blob/master/image/LibreOffice-Google-XLSX.png

	1   QVariant(double, 1) OK:it's auto style (1)
	2   QVariant(QString, "2") OK:it's shared string. (2) see ./xl/sharedStrings.xml 
	3   QVariant(double, 3) PENDING:it's number (3.00) (TODO: use style[3] of cell)
	4   QVariant(double, 4) PENDING:it's percentage (400.00%) (TODO: use style[4] of cell)
	5   QVariant(double, 5) PENDING:it's exponentiation (5.00E+00) (TODO: use style[5] of cell)
	6   QVariant(double, 6) PENDING:it's accounting#1 ($ 6.00) (TODO: use style[6] of cell)
	7   QVariant(double, 7) PENDING:it's accounting#2 (7.00) (TODO: use style[7] of cell)
	8   QVariant(double, 8) PENDING:it's currency ($8.00) (TODO: use style[8] of cell)
	9   QVariant(double, 9) PENDING:it's currency(rounds) ($9) (TODO: use style[9] of cell)

	10   QVariant(QString, "1900. 1. 9") OK:it's shared string. see /xl/sharedStrings.xml
	11   QVariant(QDateTime, QDateTime(1900-01-11 00:00:00.000 KOREA KST Qt::TimeSpec(LocalTime))) PENDING:it means '1900Y.1M.11D.00H-00m-00s'. but, style[11] uses 'AM/PM HH:mm:ss' format. (TODO: use style[11] of cell)
	12   QVariant(QString, "1900. 1. 11 AM 12:00:00") OK:it's shared string. see /xl/sharedStrings.xml
	13   QVariant(QDateTime, QDateTime(1900-01-13 00:00:00.000 KOREA KST Qt::TimeSpec(LocalTime))) NOK:it's period (312H:00m:00s). [it's date. but, 13 days means 312 hours!!]
	*/

	return 0; 
}

int readLibreOffice()
{
	// WAIT...
	return 0; 
}

int readMSExcel201x()
{
	Document xlsx("ms-number.xlsx"); // ms office online

	if (!xlsx.isLoadPackage())
	{
		qDebug() << "[ms-number] failed to load package";
		return (-1);
	}
		
	return readMSExcel201xNumber(&xlsx);
}

int readMSExcel201xNumber(QXlsx::Document* pXlsx)
{
	if (NULL == pXlsx)
		return (-1);

	for (int row = 1; row < 10; ++row)
	{
		Cell* cell = pXlsx->cellAt(row, 1);
		if (cell == NULL)
			continue;

		QVariant var = cell->readValue();
		qint32 styleNo = cell->styleNumber();
		Format fmt = cell->format();

		QString strFomrat;
		if (fmt.hasNumFmtData())
		{
			QString strNumFormat = fmt.numberFormat();
			strFomrat = strFomrat + QString(" number format :") + strNumFormat;
		}

		if (styleNo >= 0)
		{
			qDebug() << row << " " << var << " , style:" << styleNo << strFomrat;
		}
		else
		{
			qDebug() << row << " " << var << strFomrat;
		}
	}

	/* Debug output
	1   QVariant(double, 1) ""
	2   QVariant(double, 2)  , style: 1 " number format :0.00_ "
	3   QVariant(double, 3000)  , style: 2 " number format :#,##0_ "
	4   QVariant(double, -4)  , style: 3 " number format :0_ ;[Red]\\-0\\ "
	
	cell value that is printed on excel
	[1]
	[2.00] 
	[3,000]  
	[red minus four] 
	*/

	return 0;
}

int readWPSOffice()
{
	return 0;
}
