#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <cstring>
#include "gt.h"
#include "gttoolkitext.h"

const char Gt::_delimiter1 = ';';
const char Gt::_delimiter2 = '|';
const char Gt::_delimiter3 = '-';

Gt *Gt::_instance = NULL;

Gt::Gt()
{

}

Gt::~Gt()
{

}

Gt *Gt::instance()
{
    if(_instance == NULL)
    {
        _instance = new Gt();
    }
    return _instance;
}

bool Gt::createDir(char *path)
{
    int result = 0;

    if(GtToolkitExt::dirIsExist(path) != 0)
    {
        result = GtToolkitExt::mkDir(path);
        if(result != 0)
        {
            GtToolkitExt::logError(__FILE__, __LINE__, "目录创建错误 %s", path);
            return false;
        }
    }
    return true;
}

void Gt::initConfig()
{
    char path[256];

    //创建config目录
    memset(_configPath, 0, sizeof(_configPath));
    strcpy(_configPath, "cfg");
    memset(path, 0, sizeof(path));
    sprintf(path, "%s/%s", _appPath, _configPath);
    if(!createDir(path))
    {
        exit(-1);
    }
    //创建dat目录
    memset(_datPath, 0, sizeof(_datPath));
    strcpy(_datPath, "dat");
    memset(path, 0, sizeof(path));
    sprintf(path, "%s/%s", _appPath, _datPath);
    if(!createDir(path))
    {
        exit(-1);
    }
    //创建log目录
    memset(_logPath, 0, sizeof(_logPath));
    strcpy(_logPath, "log");
    memset(path, 0, sizeof(path));
    sprintf(path, "%s/%s", _appPath, _logPath);
    if(!createDir(path))
    {
        exit(-1);
    }
    //创建download目录
    memset(_downloadPath, 0, sizeof(_downloadPath));
    strcpy(_downloadPath, "download");
    memset(path, 0, sizeof(path));
    sprintf(path, "%s/%s", _appPath, _downloadPath);
    if(!createDir(path))
    {
        exit(-1);
    }
    //创建resource目录
    memset(path, 0, sizeof(path));
    strcpy(path, "/sdcard");
    if(GtToolkitExt::dirIsExist(path) != 0)
    {
        memset(path, 0, sizeof(path));
        sprintf(path, "%s", _appPath);
    }
    else
    {
        memset(path, 0, sizeof(path));
        strcpy(path, "/sdcard/GtTerminal");
        if(!createDir(path))
        {
            exit(-1);
        }
    }
    memset(_resourcePath, 0, sizeof(_resourcePath));
    sprintf(_resourcePath, "%s/resource", path);
    if(!createDir(_resourcePath))
    {
        exit(-1);
    }
    //定义文件名称
    memset(_firstLoadCfgFile, 0, sizeof(_firstLoadCfgFile));
    strcpy(_firstLoadCfgFile, "first_load.cfg");
    memset(_terminalCfgFile, 0, sizeof(_terminalCfgFile));
    strcpy(_terminalCfgFile, "terminal.cfg");
    memset(_tradingSNDatFile, 0, sizeof(_tradingSNDatFile));
    strcpy(_tradingSNDatFile, "tsn.dat");
    memset(_lastTicketDatFile, 0, sizeof(_lastTicketDatFile));
    strcpy(_lastTicketDatFile, "last_ticket.dat");
    memset(_registerDatFile, 0, sizeof(_registerDatFile));
    strcpy(_registerDatFile, "register.dat");
    memset(_terminalNoDatFile, 0, sizeof(_terminalNoDatFile));
    strcpy(_terminalNoDatFile, "terminalNo.dat");
    memset(_tradingLogFile, 0, sizeof(_tradingLogFile));
    strcpy(_tradingLogFile, "trading.log");
    memset(_errorLogFile, 0, sizeof(_errorLogFile));
    strcpy(_errorLogFile, "error.log");
    memset(_crashLogFile, 0, sizeof(_crashLogFile));
    strcpy(_crashLogFile, "crash.log");
}

/************************************************************
*功能：设置App应用目录
*输入：path app应用files目录
*输出：无
*返回：无
*/
void Gt::setAppPath(const char *path)
{
    memset(_appPath, 0, sizeof(_appPath));
    strcpy(_appPath, path);
    initConfig();
}

/************************************************************
*功能：获取config目录
*输入：无
*输出：path config绝对路径
*返回：无
*/
void Gt::getConfigPath(char *path)
{
    if(path != NULL)
    {
        sprintf(path, "%s/%s", _appPath, _configPath);
    }
}

/************************************************************
*功能：获取dat目录
*输入：无
*输出：path dat绝对路径
*返回：无
*/
void Gt::getDatPath(char *path)
{
    if(path != NULL)
    {
        sprintf(path, "%s/%s", _appPath, _datPath);
    }
}

/************************************************************
*功能：获取log目录
*输入：无
*输出：path log绝对路径
*返回：无
*/
void Gt::getLogPath(char *path)
{
    if(path != NULL)
    {
        sprintf(path, "%s/%s", _appPath, _logPath);
    }
}

/************************************************************
*功能：获取download目录
*输入：无
*输出：path download绝对路径
*返回：无
*/
void Gt::getDownloadPath(char *path)
{
    if(path != NULL)
    {
        sprintf(path, "%s/%s", _appPath, _downloadPath);
    }
}

/************************************************************
*功能：获取resource目录
*输入：无
*输出：path resource绝对路径
*返回：无
*/
void Gt::getResourcePath(char *path)
{
    if(path != NULL)
    {
        sprintf(path, "%s", _resourcePath);
    }
}

/************************************************************
*功能：获取首次启动配置文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getFirstLoadCfgFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _configPath, _firstLoadCfgFile);
    }
}

/************************************************************
*功能：获取终端配置文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getTerminalCfgFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _configPath, _terminalCfgFile);
    }
}

/************************************************************
*功能：获取交易流水号文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getTradingSNDatFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _datPath, _tradingSNDatFile);
    }
}

/************************************************************
*功能：获取最近一张票数据文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getLastTicketDatFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _datPath, _lastTicketDatFile);
    }
}

/************************************************************
*功能：获取终端激活文件
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getRegisterDatFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _datPath, _registerDatFile);
    }
}

/************************************************************
*功能：获取终端编号文件
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getTerminalNoDatFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _datPath, _terminalNoDatFile);
    }
}

/************************************************************
*功能：获取交易日志文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getTradingLogFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _logPath, _tradingLogFile);
    }
}

/************************************************************
*功能：获取错误日志文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getErrorLogFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _logPath, _errorLogFile);
    }
}

/************************************************************
*功能：获取Crash日志文件路径
*输入：无
*输出：fileName 绝对路径+文件名
*返回：无
*/
void Gt::getCrashLogFile(char *fileName)
{
    if(fileName != NULL)
    {
        sprintf(fileName, "%s/%s/%s", _appPath, _logPath, _crashLogFile);
    }
}