#include <SQLAPI.h>
#include <string>
#include <sstream>
#include <exception>
#include <stdlib.h>
#include <libxl.h>
#include "DataManipulation.h"
#include "SystemDataQuery.h"
#include "StringCodeConverter.h"


//#pragma comment( lib, "user32.lib")
//#pragma comment( lib, "version.lib")
//#pragma comment( lib, "oleaut32.lib")
//#pragma comment( lib, "ole32.lib")
//#pragma comment( lib, "libxl.lib")

// #ifdef _DEBUG
// #pragma comment( lib, "sqlapisd.lib")
// #else
// #pragma comment( lib, "sqlapis.lib")
// #endif

const char g_cszConnectStringIDS6[] =
		"DRIVER={};"
		"PROTOCOL=onsoctcp;"
		"SERVICE=16191;"
		"SERVER=xmcx1;"
		"HOST=10.39.0.91;"
		"DATABASE=ids6;"
		"DB_LOCALE=en_US.819;";

const static char g_szUserNameIDS6[] = "ccx99";
const static char g_szPasswordIDS6[] = "c91IT09";

const static char g_cszConnstringYwgl[] =
		"DRIVER={};"
		"PROTOCOL=onsoctcp;"
		"SERVICE=16192;"
		"SERVER=xmcx2;"
		"HOST=10.39.0.92;"
		"DATABASE=ywgl_xm;"
		"DB_LOCALE=en_US.819;";

const static char g_cszUserNameYwgl[] = "ccx99";
const static char g_cszPasswordYwgl[] = "c92IT09";

// void queryTelsalePolicyGifts(vector<TelSalePolicyGift>& giftList)
// {
// 	SAConnection connection;
// 	SACommand    command;
//
// 	string strSQL = "select id, trim(name), default_price from w_dx_gifts";
//
// 	command.setConnection(&connection);
// 	command.setCommandText(strSQL.c_str());
//
// 	try
// 	{
// 		connection.Connect(g_cszConnstringYwgl,
// 		                   g_cszUserNameYwgl,
// 		                   g_cszPasswordYwgl,
// 		                   SA_Informix_Client);
//
// 		command.Execute();
// 	}
// 	catch (SAException& error)
// 	{
// 		throw runtime_error(error.ErrText());
// 	}
//
// 	while (command.FetchNext())
// 	{
// 		TelSalePolicyGift gift;
//
// 		gift.Id(command.Field(1).asLong());
// 		gift.GiftName((const char *)(command.Field(2).asString()));
// 		gift.GiftDefaultPrice((const char *)(command.Field(3).asString()));
//
// 		giftList.push_back(gift);
// 	}
//
// 	connection.Disconnect();
// }

void SaveTelSalePolicyInfo(const SPolicyRecord& policy, const vector<TelSalePolicyGift>& giftList)
{
	if (policy.strPolicySerial.empty() == true)
	{
		throw invalid_argument("保单号为空!");
	}

	if (policy.strSalerCode.empty() == true)
	{
		throw invalid_argument("保单号为空！");
	}

	ostringstream ostrCommand;
	string        strAutotraderCall;

	//车店联呼
	if (policy.bIsAutotraderCall == true)
	{
		strAutotraderCall = "1";
	}
	else
	{
		strAutotraderCall = "0";
	}

	ostrCommand <<
			"insert into w_dxbd_i ( jjbj, khjl, khjllx, bdh, zhjywy, zhjywymc, zhjywybm, zhjywybmm, kshdm, kshmc, czydm, czrq , chdlh, chshdm, chshmc, khmc, chph, chjh, fdjh ) "
			"values( 1, 0, 0, "
			<< "trim('" << policy.strPolicySerial << "'), "
			<< "trim('" << policy.strSalerCode << "'), "
			<< "trim('" << policy.strSalerName << "'), "
			<< "trim('" << policy.strSalerDeptCode << "'), "
			<< "trim('" << policy.strSalerDeptName << "'), "
			<< "trim('" << policy.strSalerOfficeCode << "'), "
			<< "trim('" << policy.strSalerOfficeName << "'), "
			<< "trim('" << policy.strOperatorCode << "'), "
			<< "today, "
			<< "'" << strAutotraderCall << "'";

	if (policy.strAutoTraderCode.empty() == false)
	{
		ostrCommand << ", '" << policy.strAutoTraderCode << "'";
		ostrCommand << ", '" << policy.strAutoTraderName << "'";
	}
	else
	{
		ostrCommand << ", NULL, NULL";
	}

	if (policy.strCustomerName.empty() == false)
	{
		ostrCommand << ", '" << policy.strCustomerName << "'";
	}
	else
	{
		ostrCommand << ", NULL";
	}

	if (policy.strPlateSerial.empty() == false)
	{
		ostrCommand << ", '" << policy.strPlateSerial << "'";
	}
	else
	{
		ostrCommand << ", NULL";
	}

	if (policy.strFrameSerial.empty() == false)
	{
		ostrCommand << ", '" << policy.strFrameSerial << "'";
	}
	else
	{
		ostrCommand << ", NULL";
	}

	if (policy.strEngineSerial.empty() == false)
	{
		ostrCommand << ", '" << policy.strEngineSerial << "'";
	}
	else
	{
		ostrCommand << ", NULL";
	}

	ostrCommand << " )";

	string strCommand = ostrCommand.str();

	SAConnection conn;
	SACommand    command;

	command.setConnection(&conn);
	command.setCommandText(strCommand.c_str());

	try
	{
		conn.Connect(
		             g_cszConnstringYwgl,
		             g_cszUserNameYwgl,
		             g_cszPasswordYwgl,
		             SA_Informix_Client);
		//conn.setAutoCommit( SA_AutoCommitOff ); //导致锁表

		//保存保单
		command.Execute();

		//保存礼品列表,先删除旧数据
		command.setCommandText("delete w_dxbd_gift_i where bdh = :1 ");
		command.Param(1).setAsString() = policy.strPolicySerial.c_str();
		command.Execute();

		command.setCommandText("insert into w_dxbd_gift_i ( bdh, gift_name, gift_price ) values ( :1, :2, :3 )");

		for (vector<TelSalePolicyGift>::const_iterator iter = giftList.begin(); iter != giftList.end(); ++iter)
		{
			command.Param(1).setAsString() = policy.strPolicySerial.c_str();
			command.Param(2).setAsString() = iter->GiftName().c_str();
			command.Param(3).setAsString() = iter->GiftDefaultPrice().c_str();

			command.Execute();
		}

		conn.Commit();
	}
	catch (SAException& error)
	{
		conn.Rollback();
		conn.Disconnect();

		throw runtime_error(error.ErrText());
	}

	conn.Disconnect();
}

void QueryTelSalePolicyInfo(const string&         strPolicyNo,
                            const string&         strOperatorCode,
                            const string&         strStartDate,
                            const string&         strEndDate,
                            vector<SPolicyQuery>& vPolicyInfo)
{
	SACommand    command;
	SAConnection connection;
	SPolicyQuery policy;

	string strSQL =
			"select trim(bdh) bdh, trim(zhjywy) zhjywy, to_char(czrq, '%Y年%m月%d日') czrq, trim(czydm) czydm, chdlh, zhjywybmm, kshmc, chshdm, chshmc "
			"  from w_dxbd_i "
			" where 1=1 ";

	if (!strPolicyNo.empty())
	{
		strSQL.append("and bdh = '");
		strSQL.append(strPolicyNo);
		strSQL.append("' ");
	}

	if (!strOperatorCode.empty())
	{
		strSQL.append("and czydm = '");
		strSQL.append(strOperatorCode);
		strSQL.append("' ");
	}

	if (!strStartDate.empty())
	{
		strSQL.append("and czrq >= '");
		strSQL.append(strStartDate);
		strSQL.append("' ");
	}

	if (!strEndDate.empty())
	{
		strSQL.append("and czrq <= '");
		strSQL.append(strEndDate);
		strSQL.append("' ");
	}

	try
	{
		command.setCommandText(strSQL.c_str());
		command.setConnection(&connection);

		connection.Connect(
		                   g_cszConnstringYwgl,
		                   g_cszUserNameYwgl,
		                   g_cszPasswordYwgl,
		                   SA_Informix_Client);

		command.Execute();

		while (command.FetchNext())
		{
			policy.strPolicySerial   = command.Field("bdh").asString();
			policy.strSalerCode      = command.Field("zhjywy").asString();
			policy.strDeptName       = command.Field("zhjywybmm").asString();
			policy.strOfficeName     = command.Field("kshmc").asString();
			policy.strAutoTraderCode = command.Field("chshdm").asString();
			policy.strAutoTraderName = command.Field("chshmc").asString();
			policy.strInputDate      = command.Field("czrq").asString();
			policy.strCDLH           = command.Field("chdlh").asString();

			//QueryPolicyGifts(policy.strPolicySerial, policy.strGifts, policy.dGiftPriceSum);

			vPolicyInfo.push_back(policy);
		}

		connection.Disconnect();
	}
	catch (SAException& error)
	{
		throw runtime_error(error.ErrText());
	}
}

// void QueryPolicyGifts(const string& strPolicyNo, string& strGifts, double dGiftPriceSum)
// {
// 	SAConnection connection;
// 	SACommand    command;
//
// 	string strSQL =
// 			"select gift_name, gift_price "
// 			"  from w_dxbd_gift_i "
// 			" where bdh = '" + strPolicyNo + "'";
//
// 	string strSQLSum =
// 			"select sum( gift_price ) "
// 			"  from w_dxbd_gift_i "
// 			" where bdh = '" + strPolicyNo + "'";
//
// 	try
// 	{
// 		command.setConnection(&connection);
// 		command.setCommandText(strSQL.c_str());
//
// 		connection.Connect(g_cszConnstringYwgl,
// 		                   g_cszUserNameYwgl,
// 		                   g_cszPasswordYwgl,
// 		                   SA_Informix_Client);
//
// 		command.Execute();
//
// 		strGifts.clear();
// 		dGiftPriceSum = 0.0;
//
// 		while (command.FetchNext())
// 		{
// 			if (!strGifts.empty())
// 			{
// 				strGifts.append("; ");
// 			}
//
// 			strGifts.append(command.Field("gift_name").asString());
// 			strGifts.append(" ");
// 			strGifts.append(command.Field("gift_price").asString());
// 			strGifts.append("元");
//
// 			dGiftPriceSum += command.Field("gift_price").asDouble();
// 		}
//
// 		/*command.setCommandText( strSQLSum.c_str() );
// 		command.Execute();
//
// 		if ( command.FetchNext() )
// 		{
// 		strGiftPriceSum = command.Field( 0 ).asString();
// 		}*/
//
// 		connection.Disconnect();
// 	}
// 	catch (SAException& error)
// 	{
// 		throw runtime_error(error.ErrText());
// 	}
// }


/*void readTelsaleXlsFile(const string strFilePath, vector<SPolicyRecord> & listPolicy, bool hasTitle, bool isXML )
{
	Book * pBook = NULL;
	Sheet * pSheet = NULL;

	int iRowCount = 0;
	int iRowIndex = 0;
	
	
	if ( isXML == true )
	{
		pBook = xlCreateXMLBook();
	}
	else
	{
		pBook = xlCreateBook();
	}
	

	if ( pBook == NULL )
	{
		throw string("");
	}

	if ( pBook->load(strFilePath.c_str()) == NULL )
	{
		string strMessage = pBook->errorMessage();
		throw string( strMessage );
	}

	pSheet = pBook->getSheet( 0 );

	if ( pSheet == NULL )
	{
		throw string( "读取sheet失败！" );
	}

	iRowCount = pSheet->lastRow();

	if ( hasTitle == true )
	{
		iRowIndex = 1;
	}

	//读取数据
	while ( iRowIndex < iRowCount )
	{
		SPolicyRecord policy;

		CellType type = pSheet->cellType( iRowIndex, 4 );

		policy.strSignDate     = readXlsxCell( pSheet, iRowIndex, 0 );
		policy.strPolicySerial = readXlsxCell( pSheet, iRowIndex, 1 );
		policy.strPlateSerial  = readXlsxCell( pSheet, iRowIndex, 2 );
		policy.strCustomerName = readXlsxCell( pSheet, iRowIndex, 3 );
		policy.strSalerCode    = readXlsxCell( pSheet, iRowIndex, 4 );
		//policy.strAutoTraderName = readXlsCell( pSheet, iRowIndex, 5 );
		policy.strAutoTraderCode = readXlsxCell( pSheet, iRowIndex, 6 );

		//补齐工号
		if ( policy.strSalerCode.length() == 1 )
		{
			policy.strSalerCode = string("00") + policy.strSalerCode;
		}

		if ( policy.strSalerCode.length() == 2 )
		{
			policy.strSalerCode = string("0") + policy.strSalerCode;
		}

		policy.strOperatorCode = getUserCode();

		query_auto_trader_info( policy.strAutoTraderCode, policy.strAutoTraderName );

		query_staff_info( policy.strSalerCode, 
			            policy.strSalerName, 
						policy.strSalerDeptCode,
						policy.strSalerDeptName,
						policy.strSalerOfficeCode,
						policy.strSalerOfficeName );

		listPolicy.push_back( policy );

		iRowIndex++;
	}

	pBook->release();
}*/

string readXlsCell(ISheetT<char>* pSheet, int iRowIndex, int iColIndex)
{
	string strCell;
	char   szNum[40];
	int    iCell;

	if (pSheet == NULL)
	{
		throw string("");
	}

	CellType cellType = pSheet->cellType(iRowIndex, iColIndex);

	switch (cellType)
	{
		case libxl::CELLTYPE_STRING:
			strCell = pSheet->readStr(iRowIndex, iColIndex);
			break;
		case libxl::CELLTYPE_NUMBER:
			memset(szNum, NULL, 40);

			iCell = pSheet->readNum(iRowIndex, iColIndex);
			sprintf_s(szNum, "%d", iCell);
			strCell = szNum;

			break;
		default:
			strCell = "";
	}

	return strCell;
}

string readXlsxCell(ISheetT<wchar_t>* pSheet, int iRowIndex, int iColIndex)
{
	wstring strCell;
	string  strReturn;

	char szNum[40];
	int  iCell;

	if (pSheet == NULL)
	{
		throw string("");
	}

	CellType cellType = pSheet->cellType(iRowIndex, iColIndex);

	switch (cellType)
	{
		case libxl::CELLTYPE_STRING:
			strCell = pSheet->readStr(iRowIndex, iColIndex);
			break;
		case libxl::CELLTYPE_NUMBER:
			memset(szNum, NULL, 40);

			iCell = pSheet->readNum(iRowIndex, iColIndex);
			sprintf_s(szNum, "%d", iCell);
			strReturn = szNum;

			break;
		default:
			strReturn = "";
	}

	StringCodeConverter::unicode2mbs(strCell, strReturn);

	return strReturn;
}

void readTelsaleXlsxFile(const wstring& filePath, vector<SPolicyRecord>& listPolicy, bool hasTitle)
{
	IBookT<wchar_t>*  pBook  = NULL;
	ISheetT<wchar_t>* pSheet = NULL;

	int iRowCount = 0;
	int iRowIndex = 0;


	pBook = xlCreateXMLBookW();

	if (pBook == NULL)
	{
		throw string("");
	}

	if (pBook->load(filePath.data()) == false)
	{
		throw string("打开文件失败！");
	}

	pSheet = pBook->getSheet(0);

	if (pSheet == NULL)
	{
		throw string("读取sheet失败！");
	}

	iRowCount = pSheet->lastRow();

	if (hasTitle == true)
	{
		iRowIndex = 1;
	}

	//读取数据
	while (iRowIndex < iRowCount)
	{
		SPolicyRecord policy;

		CellType type = pSheet->cellType(iRowIndex, 4);

		policy.strSignDate       = readXlsxCell(pSheet, iRowIndex, 0);
		policy.strPolicySerial   = readXlsxCell(pSheet, iRowIndex, 1);
		policy.strPlateSerial    = readXlsxCell(pSheet, iRowIndex, 2);
		policy.strCustomerName   = readXlsxCell(pSheet, iRowIndex, 3);
		policy.strSalerCode      = readXlsxCell(pSheet, iRowIndex, 4);
		policy.strAutoTraderName = readXlsxCell(pSheet, iRowIndex, 6);

		//补齐工号
		if (policy.strSalerCode.length() == 1)
		{
			policy.strSalerCode = string("00") + policy.strSalerCode;
		}

		if (policy.strSalerCode.length() == 2)
		{
			policy.strSalerCode = string("0") + policy.strSalerCode;
		}

		policy.strOperatorCode = getUserCode();

		query_staff_info(
		               policy.strSalerCode,
		               policy.strSalerName,
		               policy.strSalerDeptCode,
		               policy.strSalerDeptName,
		               policy.strSalerOfficeCode,
		               policy.strSalerOfficeName);

		listPolicy.push_back(policy);

		iRowIndex++;
	}

	pBook->release();
}
