/*
 *========================================================================
 *
 *   시스템명 : 요금징수 시스템
 *   파 일 명 : manager.pc
 *   작 성 자 : 오효섭 (catacath@neighbor21.co.kr)
 *   작 성 일 : 2012.10.11
 *   수 정 일 : 
 *   설    명 : 
 *
 *========================================================================
*/

#include    <stdio.h>
#include    <signal.h>
#include    <sys/wait.h>
#include    <sys/errno.h>
#include    <sys/types.h>
#include    <sys/ipc.h>
#include    <sys/msg.h>
#include    <time.h>

#include "dir_path.h"
#include "path_def.h"
#include "chg_struc.h"
#include "def_set.h"
#include "crd_def.h"
#include "MessageSender.h"

#define MAKEMST 0
#define MAKECHG 1
//#define _ORACLE_

long  glRunning 	= PROC_RUNNING;

extern int f_errno;
extern int f_recnum;

//EXEC SQL INCLUDE SQLCA;
//EXEC SQL INCLUDE ORACA;

/*
 *========================================================================
 *
 *   함 수 명 : SIG_term
 *   작 성 자 : 오효섭 (catacath@neighbor21.co.kr)
 *   작 성 일 : 2012.10.10
 *   수 정 일 :
 *   설    명 : 
 *
 *========================================================================
*/

void SIG_term(int sig)
{
    disconnect_db();
    exit(0);
}

/*
 *========================================================================
 *
 *   함 수 명 : main
 *   작 성 자 : 오효섭 (catacath@neighbor21.co.kr)
 *   작 성 일 : 2012.10.10
 *   수 정 일 :
 *   설    명 : 
 *
 *========================================================================
*/

int main(int argc, char *argv[])
{
    char uid[20];
    char pwd[20];
    char host[20];
    char plz_id[2];
    char s_date[16];
    char e_date[8+1];
    char f_date[16];
    char wrk_dir[128];
    char save_dir[128];
    char msg[1024];
	char oMsg[1024];
    char run_path[64];
	char bin_path[64];
	char spath[128];
	char tpath[128];
    char upid_bl_snd_yn[1+1];
//EXEC SQL BEGIN DECLARE SECTION;
    int  rvs_basic, rvs_wrkr, rvs_immcarno, rvs_rfid, rvs_bef, rvs_bin, rvs_pl;
    char fare_id[2+1];
	char tmp_rvs[2+1];
	char tmp_rvs2[2+1];
	char sToday[8+1];
	int  result;
//EXEC SQL END DECLARE SECTION;
    int    i, status, size;
    int    sckm = 0;
    FILE   *fp = NULL;
    time_t ctime;
    struct tm *ctm;
    int    nResult, blno;
    char   ch;
	char   *p;
	char   *pData;
	char   *pProc[10] = { NULL, };
    struct chg_struc cs;
    struct write_info wi;
    //struct basic_tbl bs;
    int seq, ret;
    //pid_t prc_id[99];
    int maxPrcnt = 0;
	int makePL = 0;
	//int procPid[99];
    pid_t pid;
	pid_t pid_child;
	struct {
		pid_t prc_id;
		int procPid;
	} proc_stat[99];

	p = argv[0];
	nResult = InitMessageSenderConfig(p);

    if (nResult != MQ_ERR_SUCCESS)
    {
        printf("Program terminated!!!\n");
        return -1;
    }

    sprintf(wrk_dir, "%s/manager", LOG_DIR);
    mkdir(wrk_dir, 0755);
    chdir(wrk_dir);

    signal(SIGTERM, SIG_term);
    sprintf(plz_id, "%.2s", PLZ_CODE2);
	memcpy(fare_id, plz_id, 2);
    fare_id[2] = '\0';
    memset(run_path, 0x00, sizeof(run_path));

    while(1)
    {
        ctime = time(NULL);
        ctm = localtime(&ctime);
        if((ctm->tm_hour == 1) && (ctm->tm_min == 1) && (ctm->tm_sec == 10))
        {
            memset(msg, 0x00, sizeof(msg));
            sprintf(msg, "mv /app_data/tcs/FILE/RECV/*SF* /app_data/tcs/FILE/RECV/SAVE");
            system(msg);
        }

#if 0
		if((ctm->tm_hour == 12) && (ctm->tm_min == 50) && (ctm->tm_sec == 10)) //수집서버 수동처리
#else
		if((ctm->tm_hour == 4) && (ctm->tm_min == 5) && (ctm->tm_sec == 30))
#endif
		{
            memset(msg, 0x00, sizeof(msg));
#if 1
            sprintf(msg, "%s/plftp.sh", DIR_BIN);
            system(msg);
#endif
#if 1
            ret = searchFile(1);
#else
            ret = 1;
#endif

            if(ret < 0)
            {
                proc_log("교통카드 PL 파일처리 실패\n");
                continue;
            }else
            {
#if 1
#ifdef _ORACLE_
                if(c_DbConnect()<0)
                {
                    proc_log("DB 접속에러 %d", sqlca.sqlcode);
                    continue; 
                }
#endif
                memset(msg, 0x00, sizeof(msg));
                sprintf(msg, "cp -R %s/%s/PLTPCARDMST_S %s/%s/PLBASE", DIR_TCS, DIR_BASEINFO, DIR_TCS, DIR_BASEINFO);
                system(msg);
                sleep(1);
                memset(msg, 0x00, sizeof(msg));
                sprintf(msg, "split -b 100000000 %s/%s/PLBASE/PLTPCARDMST_S %s/%s/PLBASE/PLMST", DIR_TCS, DIR_BASEINFO, DIR_TCS, DIR_BASEINFO);
                system(msg);
                sleep(1);

                memset(spath, 0x00, sizeof(spath));
                memset(tpath, 0x00, sizeof(tpath));
                for(i = 0; i < 14; i++)
                {
                    ch = i+0x61;
                    sprintf(spath, "%s/%s/PLBASE/PLMSTa%c", DIR_TCS, DIR_BASEINFO, ch);
                    sprintf(tpath, "%s/%s/PLBASE/PLMST%03d", DIR_TCS, DIR_BASEINFO, i);
                    lb_rename(spath, tpath);
                    proc_log("rename %s %s", spath, tpath);
                }

                memset(spath, 0x00, sizeof(spath));
                memset(tpath, 0x00, sizeof(tpath));
                sprintf(spath, "%s/%s/PLTCRDINFO_S", DIR_TCS, DIR_BASEINFO);
                sprintf(tpath, "%s/%s/PLTCRDINFO", DIR_TCS, DIR_BASEINFO);
                lb_rename(spath, tpath);

				memset(spath, 0x00, sizeof(spath));
                memset(tpath, 0x00, sizeof(tpath));
                sprintf(spath, "%s/%s/PLTPCARDMST_S", DIR_TCS, DIR_BASEINFO);
                sprintf(tpath, "%s/%s/PLTPCARDMST", DIR_TCS, DIR_BASEINFO);
                lb_rename(spath, tpath);
#ifdef _ORACLE_
                EXEC SQL
                SELECT TCRD_PL_RVS_NO, BAS_RVS_NO
                INTO  :tmp_rvs,
				      :tmp_rvs2
                FROM TB_CFS_TABLENOM
                WHERE FARE_OFFICE_ID = :fare_id
                ;

                if(sqlca.sqlcode < 0)
                {
                    proc_log("기초사항 조회 에러[%d]", sqlca.sqlcode);
                    continue;
                }

                rvs_pl = lb_data2atoi(tmp_rvs, 2);
				rvs_basic = lb_data2atoi(tmp_rvs2, 2);

                if(rvs_pl >= 99)
                    rvs_pl = 0;

				if(rvs_basic >= 99)
                    rvs_basic = 0;

                sprintf(tmp_rvs, "%02d", rvs_pl+1);
				sprintf(tmp_rvs2, "%02d", rvs_basic+1);

                EXEC SQL
                UPDATE TB_CFS_TABLENOM
                SET TCRD_PL_RVS_NO = :tmp_rvs,
                    TCRD_PL_UPDATE_DATE = sysdate,
                    TCRD_PL_APPLY_DATE = sysdate,
					BAS_RVS_NO = :tmp_rvs2,
                    BAS_UPDATE_DATE = sysdate,
                    BAS_APPLY_DATE = sysdate
                WHERE FARE_OFFICE_ID = :fare_id
                ;

                if(sqlca.sqlcode < 0)
                {
                    proc_log("개정번호 변경 오류[%d]", sqlca.sqlcode);
                    EXEC SQL ROLLBACK WORK;
                    continue;
                }
                
                EXEC SQL COMMIT WORK;
#else
                sprintf(msg, "%.2s0807002100%c", PLZ_CODE2, '\0');
                MessageSender(FNO_RVS_UPT, msg, p, oMsg);
                proc_log("############ PL 개정정보 변경 [%s]\n", oMsg);

                sprintf(msg, "%.2s0207002100%c", PLZ_CODE2, '\0');
                MessageSender(FNO_RVS_UPT, msg, p, oMsg);
                proc_log("############ WRKR 개정정보 변경 [%s]\n", oMsg);

                sprintf(msg, "0091%.2s%.2s%c", PLZ_CODE2, PLZ_CODE2, '\0');
                MessageSender(FNO_WRKRINFO, msg, p, oMsg);
                proc_log("############ 근무자 송신 결과 [%s]\n", oMsg);

                sprintf(msg, "%.2s0107002100%c", PLZ_CODE2, '\0');
                MessageSender(FNO_RVS_UPT, msg, p, oMsg);
                proc_log("############ BASIC 개정정보 변경 [%s]\n", oMsg);

                sprintf(msg, "0092%.2s%.2s%c", PLZ_CODE2, PLZ_CODE2, '\0');
                MessageSender(FNO_BASICTBL, msg, p, oMsg);
                proc_log("############ 기초 송신 결과 [%s]\n", oMsg);
#endif

#ifdef _ORACLE_
				memset(msg, 0x00, sizeof(msg));
				sprintf(msg, "java -jar %s/basicRebuild.jar", DIR_BIN);
                system(msg);

                proc_log("교통카드 PL파일처리 완료\n");
                disconnect_db();
#endif
#endif
            }
            makePL = 1;

			proc_log("교통카드 PL 마스터 파일처리 완료\n");
		}

        sleep(1);
    }
}
