#include <qsee_sync.h>

#include <grdm_common.h>
#include <grdm_transport.h>
#include <grdm_log.h>

#define ESE_UDELAY				qsee_spin

#define MAX_FILE_DATA_SIZE 256
#define MAX_POLLING_COUNT 100

GRDM_RESULT grdm_fdc_check_status(uint32_t *status)
{
	GRDM_RESULT grdm_ret = GRDM_NO_ERROR;
	uint8_t apdu[5] = {0x80, 0x88, 0x03, 0x00, 0x02};
	secGrdm_7816_rpdu_t rpdu;

	LOG_E("grdm_fdc_check_status");
	grdm_ret = grdm_openLogicalChannel();
	if (grdm_ret != GRDM_NO_ERROR) {
		LOG_E("grdm_openLogicalChannel failed : %d\n", grdm_ret);
		return grdm_ret;
	}

	memset(&rpdu, 0x0, sizeof(secGrdm_7816_rpdu_t));
	grdm_ret = secGrdmAPDUTransmit(apdu, 5, &rpdu);

	LOG_E("rpdu : sw1 : 0x%x\n", rpdu.sw1);
	LOG_E("rpdu : sw2 : 0x%x\n", rpdu.sw2);
	LOG_E("rpdu len : %d\n", rpdu.len);

	if(rpdu.len > 0) {
		LOG_E("rpdu status : 0x%x\n", rpdu.pdata[0]);
		if (rpdu.pdata[0] == 0x0)
			*status = 0;
		else if (rpdu.pdata[0] == 0xff)
			*status = 1;
		else
			*status = 2;
	}

	if (grdm_closeLogicalChannel() != GRDM_NO_ERROR) {
		LOG_E("grdm_closeLogicalChannel failed : %d\n", grdm_ret);
	}

	return grdm_ret;
}

GRDM_RESULT grdm_fdc_check_Restriction(uint32_t *status)
{
	GRDM_RESULT grdm_ret = GRDM_NO_ERROR;
	uint8_t apdu[5] = {0x80, 0x88, 0x04, 0x00, 0x02};
	secGrdm_7816_rpdu_t rpdu;

	LOG_E("grdm_fdc_check_Restriction");
	grdm_ret = grdm_openLogicalChannel();
	if (grdm_ret != GRDM_NO_ERROR) {
		LOG_E("grdm_openLogicalChannel failed : %d\n", grdm_ret);
		return grdm_ret;
	}

	memset(&rpdu, 0x0, sizeof(secGrdm_7816_rpdu_t));
	grdm_ret = secGrdmAPDUTransmit(apdu, 5, &rpdu);

	LOG_E("rpdu : sw1 : 0x%x\n", rpdu.sw1);
	LOG_E("rpdu : sw2 : 0x%x\n", rpdu.sw2);
	LOG_E("rpdu len : %d\n", rpdu.len);

	if(rpdu.len > 0) {
		LOG_E("rpdu status : 0x%x 0x%x\n", rpdu.pdata[0], rpdu.pdata[1]);
		if (rpdu.pdata[1] == 0x80)
			*status = 0;
		else if (rpdu.pdata[1] == 0x81)
			*status = 1;
		else
			*status = 2;
	}

	if (grdm_closeLogicalChannel() != GRDM_NO_ERROR) {
		LOG_E("grdm_closeLogicalChannel failed : %d\n", grdm_ret);
	}

	return grdm_ret;
}
