internal void Main_Entry_Point (int argc, WCHAR **argv); 

#if OS_WINDOWS
 #if BUILD_CONSOLE_INTERFACE
  int wmain(int argc, WCHAR **argv) {
    Main_Entry_Point(argc, argv);
    return 0;
  }
 #else
  #pragma comment(linker, "/SUBSYSTEM:WINDOWS")
  #include <cstdlib> // globals __argc, __wargv
 
  int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd) {
    Main_Entry_Point(__argc, __wargv);
    return 0;
  }
 #endif
#endif

internal void Main_Entry_Point (int argc, WCHAR **argv) { // #entry_point: Main + Context Setup
  // #TODO: Check if base frequency is even available.
  u32 base_frequency = (u32)CPU_Base_Frequency();
  set_cpu_base_frequency(base_frequency); // REQUIRED FOR TIMING MODULE! will depend on CPU
  
#if BASE_RUN_TESTS
  run_pre_setup_tests(); // #no_context: context will not be initialized at this point.
#endif
  // #NOTE: Be careful using a timing or auto-release macros 
  // before setting up the thread context!
  Bootstrap_Main_Thread_Context();
  
  stack_trace(); // #stack_trace: #entry_point (first stack trace)
  
#if OS_WINDOWS
  Win32_Entry_Point(argc, argv);
#endif
#if OS_LINUX
  // Linux_Entry_Point(argc, argv);
#endif
#if BASE_RUN_TESTS
  run_post_setup_tests();
#endif
#if BUILD_EXPLORER_APP_WIN32 // #entry_point: Custom program
  Explorer_ImGui_Application_Win32(); // #rename
#endif
#if BUILD_CUSTOM_GUI
 // Custom GUI based on Vik's prototype [WIP]
 /* Alternative if we're using OpenGL.
  graphics_set_render_target(get_main_window());
  
  // 3. Init Graphics (DX11 or OpenGL3)
  // #TODO: #Graphics#Main - `Main_Entry_Point`
  
  // 4. [ ] Setup Mouse and Keyboard Inputs 
  // 5. [ ] Launch second thread; thread groups
 */
#endif
}

