//---------------------------------------------------------------------------

#ifndef CDSAviFH
#define CDSAviFH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <ADODB.hpp>
#include <DB.hpp>
#include "cxCustomData.hpp"
#include "ITSLibF.h"
//---------------------------------------------------------------------------

/*
*  Avi Sect Link class
*/
class TItsAviLink
{
public:
    TItsAviLink();
    virtual ~TItsAviLink();
    void Clear();
private:
    bool    FCompleted;
    int     FEditMode;
	int     FGridIndex;

public:

    String AVI_CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			AVI 제어기 관리 번호
    String AVI_SECT_NMBR;       //VARCHAR2(10)	N			AVI 구간 번호
    String LINK_ID;             //NUMBER(10)	N			링크 ID
    int    ORD;                 //NUMBER(3)	Y	0		순서
    String MEM_DEL;
    
public:
    __property bool   Completed = {read = FCompleted, write = FCompleted};
	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
};

/*
*  Avi Sect class
*/
class TItsAviSect
{
public:
    TItsAviSect();
    virtual ~TItsAviSect();
    void Clear();
private:
    bool    FCompleted;
    int     FEditMode;
	int     FGridIndex;

public:

    String AVI_CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			AVI 제어기 관리 번호
    int    ORD;                 //NUMBER(3)	Y	0		순서

    String AVI_SECT_NMBR;       //VARCHAR2(10)	N			AVI 구간 번호
    String STRT_SPOT_NM;        //VARCHAR2(60)	Y			시작 지점 명
    String END_SPOT_NM;         //VARCHAR2(60)	Y			종료 지점 명
    String AVI_SECT_NM;         //VARCHAR2(60)	Y			AVI 구간 명
    String AVI_SECT_DSTC;       //NUMBER(6)	Y	0		AVI 구간 거리
    String SHRT_PASS_HH;        //NUMBER(6)	Y	0		최단 통과 시간
    String LNST_PASS_HH;        //NUMBER(6)	Y	0		최장 통과 시간
    String SPOT_NUM;            //NUMBER(3)	Y	0		지점 개수
    String STND_DRFT_VAL;       //NUMBER(9)	Y			표준 편차 값
    String MIN_SPED;            //NUMBER(3)	Y	0		최소 속도
    String MAX_SPED;            //NUMBER(3)	Y	0		최대 속도
    String SMTH_FCTR;           //NUMBER(5,2)	Y	0		평활화 계수
    String DEL_YN;              //CHAR(1)	Y	'N'		삭제 여부
    String MEM_DEL;
    
    TItsMap<int, TItsAviLink*>  FLinkLists;
public:
    __property bool   Completed = {read = FCompleted, write = FCompleted};
	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
};

/*
*  AviDtct class
*/
class TItsAviDtct
{
public:
    TItsAviDtct();
    virtual ~TItsAviDtct();
    void Clear();
private:
    bool    FCompleted;
    int     FEditMode;
	int     FGridIndex;

public:

    String DTCT_NMBR;       //VARCHAR2(8)	N			검지기 번호
    String DTCT_NM;         //VARCHAR2(40)	N			검지기 명
    String CTLR_MNGM_NMBR;  //VARCHAR2(20)	Y			제어기 관리 번호
    String DTCT_TYPE_CD;    //VARCHAR2(7)	Y			검지기 유형 코드
    String ISTL_LANE;       //NUMBER(2)	    Y			설치 차로
    String USE_YN;          //CHAR(1)	    Y	'N'		사용 여부
    String DEL_YN;          //CHAR(1)	    Y	'N'		삭제 여부
    int    MAX_TFVL;        //NUMBER(6)	    Y	0		최대 교통량
    int    MIN_TFVL;        //NUMBER(6)	    Y	0		최소 교통량
    float  MAX_OCPY_RATE;   //NUMBER(6,2)	Y			최대 점유 율
    float  MIN_OCPY_RATE;   //NUMBER(6,2)	Y			최소 점유 율
    int    MIN_SPED;        //NUMBER(3)	    Y	0		최소 속도
    int    MAX_SPED;        //NUMBER(3)	    Y	0		최대 속도

    String MEM_DEL;

public:
    __property bool   Completed = {read = FCompleted, write = FCompleted};
	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
};
//---------------------------------------------------------------------------

/*
*  Avi class
*/
class TItsAvi
{
public:
    TItsAvi();
    virtual ~TItsAvi();
    void Clear();
private:
    bool    FCompleted;
    int     FEditMode;
	int     FGridIndex;

public:

    String AVI_CTLR_MNGM_NMBR;  //VARCHAR2(20)	N			AVI 제어기 관리 번호
    String AVI_ID;              //VARCHAR2(10)	Y			AVI ID
    String LINK_ID;             //NUMBER(10)	Y			링크 ID
    String AVI_LCTN_NM;         //VARCHAR2(60)	Y			AVI 위치 명
    String AVI_VALD_YN;         //CHAR(1)	Y	'N'		AVI 유효 여부
    String AVI_CTLR_IP;         //VARCHAR2(20)	Y			AVI 제어기 아이피
    String AVI_CTLR_CMNC_PORT;  //VARCHAR2(5)	Y			AVI 제어기 통신 포트
    String AVI_MAIN_CTLR_YN;    //CHAR(1)	Y	'N'		AVI 주 제어기 여부
    String AVI_MNGM_LANE_NUM;   //NUMBER(2)	Y			AVI 관리 차로 개수
    String AVI_CMRA_NUM;        //NUMBER(2)	Y			AVI 카메라 개수
    String AVI_DTCT_NUM;        //NUMBER(2)	Y			AVI 검지기 개수
    String AVI_DTCT_NM;         //VARCHAR2(60)	Y			AVI 검지기 명
    String AVI_CLCT_CYCL;       //NUMBER(3)	Y			AVI 수집 주기
    String AVI_LAMP_AUTO_YN;    //CHAR(1)	Y	'N'		AVI 조명장치 자동 여부
    String AVI_LAMP_ON_HMS;     //VARCHAR2(6)	Y			AVI 조명장치 ON 시각
    String AVI_LAMP_OFF_HMS;    //VARCHAR2(6)	Y			AVI 조명장치 OFF 시각
    String AVI_LAMP_ON_YN;      //CHAR(1)	Y	'N'		AVI 조명장치 ON 여부
    String X_CRDN;              //NUMBER(11,8)	Y			X 좌표
    String Y_CRDN;              //NUMBER(10,8)	Y			Y 좌표
    String RMRK;                //VARCHAR2(600)	Y			비고
    String DEL_YN;              //CHAR(1)	Y	'N'		삭제 여부
    String MEM_DEL;
    
    TItsMap<String, TItsAviDtct*>   FDtctLists;
    TItsMap<String, TItsAviSect*>   FSubLists;
public:
    __property bool   Completed = {read = FCompleted, write = FCompleted};
	__property int    EditMode  = {read = FEditMode,  write = FEditMode };
	__property int    GridIndex = {read = FGridIndex, write = FGridIndex };
};
//---------------------------------------------------------------------------

/*
* Avi Manager
*/
class TItsAviManager
{
public:
    TItsAviManager();
    virtual ~TItsAviManager();

public:
    TItsMap<String, TItsAvi*>       FLists;
    TItsMap<String, TItsAviSect*>   FSectLists;

public:
    bool LoadFromDb(TADOConnection *ADbConn=NULL);
    bool LoadFromDtctDb(TADOConnection *ADbConn=NULL);
    bool LoadFromSectDb(TADOConnection *ADbConn=NULL);
    bool LoadFromSectLinkDb(TADOConnection *ADbConn=NULL);
    bool GetNextAviId(String &ANewId, TADOConnection *ADbConn=NULL);
    bool GetNextAviSectId(String &ANewId, TADOConnection *ADbConn=NULL);
    
    bool DeleteAvi(TItsAvi *AObj, TADOConnection *ADbConn=NULL);
    bool UpdateAvi(TItsAvi *AObj, TADOConnection *ADbConn=NULL);
    bool InsertAvi(TItsAvi *AObj, TADOConnection *ADbConn=NULL);

    bool DeleteAviSectSubTable(TItsAviSect *AObj, TADOConnection *ADbConn=NULL);
    bool DeleteAviSect(TItsAviSect *AObj, TADOConnection *ADbConn=NULL);
    bool SaveAviSect(TItsAviSect *AObj, TADOConnection *ADbConn=NULL);
};
//---------------------------------------------------------------------------
extern TItsAviManager *ItsAviManager;
//---------------------------------------------------------------------------

#endif

