//////////////////////////////////////////////////////////////////////////////
//
//  Copyright 2025 Autodesk, Inc.  All rights reserved.
//
//  Use of this software is subject to the terms of the Autodesk license 
//  agreement provided at the time of installation or download, or which 
//  otherwise accompanies this software in either electronic or hard copy form.   
//
//////////////////////////////////////////////////////////////////////////////
// includes from ObjectARX Wizard
#ifdef _DEBUG
#define _DEBUG_WAS_DEFINED
#undef _DEBUG
#endif
#include "StdAfx.h"
#ifdef _DEBUG_WAS_DEFINED
#define _DEBUG
#undef _DEBUG_WAS_DEFINED
#endif

//#include <afxtempl.h>
// TODO: add your own includes here

// Entry Point of this Application
extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void*);
// message handlers
static void OnkEndMsg(void);
static void OnkQuitMsg(void);
static void OnkDependencyMsg(void);
static void OnkNoDependencyMsg(void);
static void OnkPreQuitMsg  (void);
static void OnkLoadDwgMsg  (void);
static void OnkUnloadDwgMsg(void);
static void OnkInvkSubrMsg (void);

//help functions
void createSectionLine();
void editSectionLineStandard();
static void initApp();
static void unLoadApp();

//MFC support
extern "C" HINSTANCE _hdllInstance;
extern HWND _adsw_acadMainWnd();
extern void InitMFC();
extern void EndMFC();
BOOL InitModule(HINSTANCE, DWORD, LPVOID);

// Add your declarations here
Acad::ErrorStatus postToDb(AcDbEntity* entry, AcDbObjectId& id);
// end of declaration

/////////////////////////////////////////////////////////////////////
// acrxEntryPoint(internal)
// This function is the entry point for your application.
/////////////////////////////////////////////////////////////////////
AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* ptr)
{
  switch(msg)
  {
  case AcRx::kInitAppMsg:
    acrxDynamicLinker->unlockApplication(ptr);
    acrxDynamicLinker->registerAppMDIAware(ptr);
    initApp();
    break;
  case AcRx::kUnloadAppMsg:
    unLoadApp();
    break;
  case AcRx::kEndMsg:
    OnkEndMsg();
    break;
  case AcRx::kQuitMsg:
    OnkQuitMsg();
    break;
  case AcRx::kDependencyMsg:
    OnkDependencyMsg();
    break;
  case AcRx::kNoDependencyMsg:
    OnkNoDependencyMsg();
    break;
  case AcRx::kPreQuitMsg:
    OnkPreQuitMsg();
    break;
  case AcRx::kLoadDwgMsg:
    OnkLoadDwgMsg();
    break;
  case AcRx::kUnloadDwgMsg:
    OnkUnloadDwgMsg();
    break;
  case AcRx::kInvkSubrMsg:
    OnkInvkSubrMsg();
    break;
  default:
    break;
  }

  return AcRx::kRetOK;
}

static void OnkEndMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkQuitMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkDependencyMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkNoDependencyMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkPreQuitMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkLoadDwgMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkUnloadDwgMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}
static void OnkInvkSubrMsg(void)
{
  // TODO: add your message handler code here

  // end of message handler
}

static void initApp()
{
  InitMFC();

  // TODO: init your application
  acedRegCmds->addCommand(_T("TESTAPP"), _T("CREATESECTIONLINE"), _T("CREATESECTIONLINE"), ACRX_CMD_MODAL, createSectionLine);
  acedRegCmds->addCommand(_T("TESTAPP"), _T("SECTIONSTD"), _T("SECTIONSTD"), ACRX_CMD_MODAL, editSectionLineStandard);
  // end initApp()
}

static void unLoadApp()
{
  acedRegCmds->removeGroup(_T(/*MSG0*/"TESTAPP"));

  // TODO: clean up your application

  // END unloadApp()
  EndMFC();
}

// MFC Initialization

#define APP_ARX_NAME _T(/*MSG0*/"TestSectionLine.arx")

void InitMFC()
{
  InitModule(GetModuleHandle(APP_ARX_NAME), DLL_PROCESS_ATTACH, NULL);
}

void EndMFC()
{
  InitModule(GetModuleHandle(APP_ARX_NAME), DLL_PROCESS_DETACH, NULL);
}

static AFX_EXTENSION_MODULE arxmfcDLL;

extern BOOL InitModule(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
  if (dwReason == DLL_PROCESS_ATTACH) {
    if (!AfxInitExtensionModule(arxmfcDLL, hInstance))
      return 0;

    CTemporaryResourceOverride::SetDefaultResource(GetModuleHandle(APP_ARX_NAME));
    // TODO: add other initialization tasks here

    // end of initialization
  } else if (dwReason == DLL_PROCESS_DETACH) {
    AfxTermExtensionModule(arxmfcDLL);
    // TODO: perform other cleanup tasks here

    // end of cleanup
  }
  return 1;
}

// TODO: add your other functions here
Acad::ErrorStatus postToDb(AcDbEntity* entry, AcDbObjectId& objId)
{
  Acad::ErrorStatus es;
  AcDbBlockTable *pBlockTable;
  AcDbBlockTableRecord *pSpaceRecord;

  //  Determine appropriate space from AutoCAD core function isPspace()
  if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForWrite)) != Acad::eOk) return es;
  if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,pSpaceRecord, AcDb::kForWrite)) != Acad::eOk) return es;
  if ((es = pBlockTable->close()) != Acad::eOk) return es;
  if ((es = pSpaceRecord->appendAcDbEntity(objId, entry)) != Acad::eOk) return es;
  // be careful, entity remains opened.
  return pSpaceRecord->close();
}

// END