#if !defined(AFX_PACKAGEINFOTABLE_H__09D87BD2_2746_41E1_A805_F6563D923174__INCLUDED_)
#define AFX_PACKAGEINFOTABLE_H__09D87BD2_2746_41E1_A805_F6563D923174__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#if _MSC_VER < 1400 // To prevent STL warning for pre VC++ 2005
#pragma warning(disable:4786)
#endif

#include "afxdao.h"
#include <set>
#include <map>

#ifdef  BUILD_GUIDLL
#define     DLLCLASS    __declspec(dllexport)
#else
#define     DLLCLASS    __declspec(dllimport)
#endif

// PackageInfoTable.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CPackageInfoTable DAO recordset

class DLLCLASS CPackageInfoTableField
{
public:
    long    m_PackageTableIndex;
    CString m_PackageTableName;

// Need to overload < opertor bcos std::set requires this for less than comparison
    virtual bool operator <(const CPackageInfoTableField& rhs) const
    { // apply operator< to operands
        return m_PackageTableIndex <  rhs.m_PackageTableIndex;
    }
};

class DLLCLASS CPackageInfoTable : public CDaoRecordset
{
public:
    CPackageInfoTable(CDaoDatabase* pDatabase = NULL);
    DECLARE_DYNAMIC(CPackageInfoTable)

// Field/Param Data
// {{AFX_FIELD(CPackageInfoTable, CDaoRecordset)
    long m_PackageTableIndex;
    CString m_PackageTableName;
// }}AFX_FIELD

// Overrides
// ClassWizard generated virtual function overrides
// {{AFX_VIRTUAL(CPackageInfoTable)
public:
    virtual CString GetDefaultDBName();                      // Default database name
    virtual CString GetDefaultSQL();                         // Default SQL for Recordset
    virtual void    DoFieldExchange(CDaoFieldExchange* pFX); // RFX support
// }}AFX_VIRTUAL

// Implementation
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::set<CPackageInfoTableField> &setPkgInfoTableField);

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::set<CPackageInfoTableField> &setPkgInfoTableField, CDaoDatabase &db);

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::set<CString> &setPkgInfoTableString);

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::set<CString> &setPkgInfoTableString, CDaoDatabase &db);

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::map<int, CString> &mapPkgInfoTableField);

/// Get all records of Package Table Index and Package Table Name. Return true if successful
    static bool GetPackageInfoTable(std::map<int, CString> &mapPkgInfoTableField, CDaoDatabase &db);

/// Get num of records in PackageInfoTable
    static long GetPackageInfoTableCnt();

/// Get num of records in PackageInfoTable
    static long GetPackageInfoTableCnt(CDaoDatabase &db);

/// create CPackageInfoTableField array. lArraySize defines the array size
    static CPackageInfoTableField* CreatePackageInfoTableFieldStructure(long &lArraySize);

/// create CPackageInfoTableField array. lArraySize defines the array size
    static CPackageInfoTableField* CreatePackageInfoTableFieldStructure(CDaoDatabase &db, long &lArraySize);

/// Get all records of Package Table Index and Package Table Name. The amount of records is limited by lArraySize
    static CPackageInfoTableField* GetPackageInfoTable(long &lArraySize);

/// Get all records of Package Table Index and Package Table Name. The amount of records is limited by lArraySize
    static CPackageInfoTableField* GetPackageInfoTable(CDaoDatabase &db, long &lArraySize);

/// return true if PackageInfoTable is present in database
    static bool IsPackageInfoTablePresent();

/// return true if PackageInfoTable is present in database
    static bool IsPackageInfoTablePresent(CDaoDatabase &db);

/// Return true if use mutiple PackageInfo Table
    static bool IsUseMutiplePackageInfoTable();

/// Return true if use mutiple PackageInfo Table
    static bool IsUseMutiplePackageInfoTable(CString &csFirstTable);

/// Return true if use mutiple PackageInfo Table
    static bool IsUseMutiplePackageInfoTable(std::set<CString>::iterator &iter, std::set<CString> &setPkgInfoTableString);

/// return true if PackageInfoTable is present in database
    static bool IsUseMutiplePackageInfoTable(CDaoDatabase &db);

/// return true if PackageInfoTable is present in database. The first table name will be stored in csFirstTable.
    static bool IsUseMutiplePackageInfoTable(CDaoDatabase &db, CString &csFirstTable);

/*  return true if PackageInfoTable is present in database.
    Store the PackageInfoTable iterator in iter.
    Store the list of table in PackageInfoTable to setPkgInfoTableString */
    static bool IsUseMutiplePackageInfoTable(CDaoDatabase &db, std::set<CString>::iterator &iter, std::set<CString> &setPkgInfoTableString);

/// return true if PackageInfoTable is present in database
    static bool CanUseMutiplePackageInfoTable();

/// return true if PackageInfoTable is present in database
    static bool CanUseMutiplePackageInfoTable(CDaoDatabase &db);

/*  Create New table and Copy Field Info from source database to destination database.
    Set csDestinationDbFile to empty if same database file else set csDestinationTable to the path of the database file.
    Set bPromptError = false to disable prompt database error
    Set bGoldenData = true for golden package */
    static bool CreateNewTableAndCopyFieldInfo(CDaoDatabase &sourceDb, CDaoDatabase &destDb, CString csDestinationDbFileName, bool bPromptError = true,
                                               bool bGoldenData = false);

/*  Copy Table field data from source database to destination database.
    Set csDestinationDbFile to empty if same database file else set csDestinationTable to the path of the database file.
    Set the field name as key and field value as value in fieldAndCriteria. Set fieldAndCriteria to NULL if no Criteria
    Set bPromptError = false to disable prompt database error
    Set bGoldenData = true for golden package */
    static bool CopyTableFieldData(CDaoDatabase &sourceDb, CString csSourceTable, CString csDestinationTable,
                                   std::map<CString, CString>* fieldAndCriteria = NULL, CString csDestinationDbFileName = "", bool bPromptError = true, bool bGoldenData = false);

/*  Copy csPackageName data from Golden package to package. If cannot find table name in PackageInfoTable Table,
    by default copy table from csSourceTable to csDestinationTable. Return true if copy successful. */
    static bool CopyFromGoldenPackageData(CDaoDatabase &db, CString csSourceTable, CString csDestinationTable, CString csPackageName);

/*  Create New Package in package info table. Return true if successful.
    Set PackageName in csPackageName
    Set bGoldenData = true to create new package in golden packageinfo table
    Set bPromptError = false to disable prompt database error */
    static bool CreateNewPackageInfo(CDaoDatabase &db, CString csPackageName, bool bGoldenData = false, bool bPromptError = true);

/*  Return true if all packageinfo field in db1 and db2 fields are the same.
    Set bPromptError = false to disable prompt database error */
    static bool ComparePackageInfoField(CDaoDatabase &db1, CDaoDatabase &db2, bool bPromptError = true);

/*  Return true if the packageinfo field in csTableName in db1 and db2 fields are the same.
    Set bPromptError = false to disable prompt database error */
    static bool IsSamePackageInfoField(CDaoDatabase &db1, CDaoDatabase &db2, CString csTableName, bool bPromptError = true);

/*  Delete package in package info table. Return true if successful.
    Set bPromptError = false to disable prompt database error.
    Set bGoldenData = true to delete package in golden packageinfo table. */
    static bool DeletePackageInfo(CDaoDatabase &db, CString csPackageName, bool bGoldenData = false, bool bPromptError = true);

/*  Create Golden Package info table and copy the data from PackageInfo table. Return true if successful
    Set csDestinationDbFile to empty if same database file else set csDestinationTable to the path of the database file. */
    static bool CreateGoldenPackageDataTable(CDaoDatabase &db, CString csDestinationDbFileName = "");

/*  copy Package info data from existing package to new package. Return true if successful.
    Set bUseGoldenPackageMethod = true to copy golden package data
    Set bPromptError = false to disable prompt database error. */
    static bool CopyToNewPackageInfo(CDaoDatabase &db, CString csNewPackage, CString csExistingPackage, bool bUseGoldenPackageMethod, bool bPromptError = true);

/// Return true if Rename Package name successful. Set bGoldenData = true if rename golden package name
    static bool RenamePackage(CDaoDatabase &db, CString cOrignalPkgName, CString csNewName, bool bGoldenData = false);

/// Return true if package info table have default package. Set bGoldenData = true if check golden package table have default package
    static bool CheckHaveDefaultPackageInfo(CDaoDatabase &db, bool bUseGoldenPackageMethod = false);

/// Return the total field count of single or multiple packageinfo table
    static int GetAllPkgTblFieldCount(CDaoDatabase &db, CString csPackageInfo = "PackageInfo");

/*  Return the first element number of a particular packageinfo table.
    iWhichTable is 0 based index. First packageinfo table denotes as number 0 element */
    static int GetPkgTblStartNum(CDaoDatabase &db, int iWhichTable);

/*  Return the first element number of a particular packageinfo table.
    Set csPackageInfo to the name of table to get the first element number */
    static int GetPkgTblStartNum(CDaoDatabase &db, CString csPackageInfo = "PackageInfo");

/*  Return the last element number of a particular packageinfo table.
    iWhichTable is 0 based index. First packageinfo table denotes as number 0 element */
    static int GetPkgTblEndNum(CDaoDatabase &db, int iWhichTable);

/*  Return the last element number of a particular packageinfo table.
    Set csPackageInfo to the name of table to get the first element number */
    static int GetPkgTblEndNum(CDaoDatabase &db, CString csPackageInfo = "PackageInfo");
};

// {{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PACKAGEINFOTABLE_H__09D87BD2_2746_41E1_A805_F6563D923174__INCLUDED_)
