#  Copyright (C) 2026 ChiPass Team <contact@chipass.org>
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 2 or (at your option)
#  version 3 of the License.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.

chipass_add_component(gui)

target_sources(ChiPass_gui PRIVATE
  AboutDialog.cpp
  Application.cpp
  ApplicationSettingsWidget.cpp
  CategoryListWidget.cpp
  Clipboard.cpp
  CloneDialog.cpp
  csvImport/CsvImportWidget.cpp
  csvImport/CsvParserModel.cpp
  DatabaseIcons.cpp
  databasekey/KeyComponentWidget.cpp
  databasekey/KeyFileEditWidget.cpp
  databasekey/PasswordEditWidget.cpp
  databasekey/YubiKeyEditWidget.cpp
  DatabaseOpenDialog.cpp
  DatabaseOpenWidget.cpp
  DatabaseTabWidget.cpp
  DatabaseWidget.cpp
  DatabaseWidgetStateSync.cpp
  dbsettings/DatabaseSettingsDialog.cpp
  dbsettings/DatabaseSettingsWidget.cpp
  dbsettings/DatabaseSettingsWidgetDatabaseKey.cpp
  dbsettings/DatabaseSettingsWidgetEncryption.cpp
  dbsettings/DatabaseSettingsWidgetGeneral.cpp
  dbsettings/DatabaseSettingsWidgetMaintenance.cpp
  dbsettings/DatabaseSettingsWidgetMetaDataSimple.cpp
  DialogyWidget.cpp
  EditWidget.cpp
  EditWidgetIcons.cpp
  EditWidgetProperties.cpp
  entry/AutoTypeAssociationsModel.cpp
  entry/EditEntryWidget.cpp
  entry/EntryAttachmentsModel.cpp
  entry/EntryAttachmentsWidget.cpp
  entry/EntryAttributesModel.cpp
  entry/EntryHistoryModel.cpp
  entry/EntryModel.cpp
  entry/EntryView.cpp
  entry/NewEntryAttachmentsDialog.cpp
  entry/PreviewEntryAttachmentsDialog.cpp
  EntryPreviewWidget.cpp
  export/ExportDialog.cpp
  FileDialog.cpp
  Font.cpp
  group/EditGroupWidget.cpp
  group/GroupModel.cpp
  group/GroupView.cpp
  GuiTools.cpp
  HtmlGuiExporter.cpp
  IconModels.cpp
  Icons.cpp
  KMessageWidget.cpp
  MainWindow.cpp
  MessageBox.cpp
  MessageWidget.cpp
  osutils/OSUtilsBase.cpp
  osutils/ScreenLockListener.cpp
  osutils/ScreenLockListenerPrivate.cpp
  PasswordGeneratorWidget.cpp
  PasswordWidget.cpp
  reports/ReportsDialog.cpp
  reports/ReportsPageHealthcheck.cpp
  reports/ReportsPageHibp.cpp
  reports/ReportsPageStatistics.cpp
  reports/ReportsWidget.cpp
  reports/ReportsWidgetHealthcheck.cpp
  reports/ReportsWidgetHibp.cpp
  reports/ReportsWidgetStatistics.cpp
  SearchWidget.cpp
  SettingsWidget.cpp
  SortFilterHideProxyModel.cpp
  SquareSvgWidget.cpp
  style/StateColorPalette.cpp
  style/style.qrc
  tag/TagModel.cpp
  tag/TagsEdit.cpp
  tag/TagView.cpp
  TotpDialog.cpp
  TotpExportSettingsDialog.cpp
  TotpSetupDialog.cpp
  URLEdit.cpp
  WelcomeWidget.cpp
  widgets/ElidedLabel.cpp
  widgets/KPToolBar.cpp
  widgets/PopupHelpWidget.cpp
  wizard/ImportWizard.cpp
  wizard/ImportWizardPageReview.cpp
  wizard/ImportWizardPageSelect.cpp
  wizard/NewDatabaseWizard.cpp
  wizard/NewDatabaseWizardPage.cpp
  wizard/NewDatabaseWizardPageDatabaseKey.cpp
  wizard/NewDatabaseWizardPageEncryption.cpp
  wizard/NewDatabaseWizardPageMetaData.cpp

  ${CMAKE_SOURCE_DIR}/share/icons/icons.qrc
  ${CMAKE_SOURCE_DIR}/share/wizard/wizard.qrc
)

if (APPLE)
  target_sources(ChiPass_gui PRIVATE
    osutils/macutils/AppKit.h
    osutils/macutils/AppKitImpl.mm
    osutils/macutils/MacUtils.cpp
    osutils/macutils/ScreenLockListenerMac.cpp
    touchid/TouchID.h
    touchid/TouchID.mm
  )
elseif (FREEDESKTOP)
  target_sources(ChiPass_gui PRIVATE
    osutils/nixutils/NixUtils.cpp
    osutils/nixutils/ScreenLockListenerDBus.cpp
  )

  if (CHIPASS_ENABLE_DESKTOP_X11)
    target_sources(ChiPass_gui PRIVATE
      osutils/nixutils/X11Funcs.cpp
    )
  endif()

  qt6_add_dbus_adaptor(dbus_sources
    org.chipass.ChiPass.xml
    gui/MainWindow.h
    MainWindow
  )
  target_sources(ChiPass_gui PRIVATE
    ${dbus_sources}
  )
elseif (WIN32)
  target_sources(ChiPass_gui PRIVATE
    osutils/winutils/ScreenLockListenerWin.cpp
    osutils/winutils/WinUtils.cpp
  )

  if (MSVC)
    target_sources(ChiPass_gui PRIVATE
      winhello/WindowsHello.cpp
    )
  endif()
endif()

if (CHIPASS_ENABLE_BROWSER)
  target_sources(ChiPass_gui PRIVATE
    dbsettings/DatabaseSettingsWidgetBrowser.cpp
    entry/EntryURLModel.cpp
    reports/ReportsPageBrowserStatistics.cpp
    reports/ReportsWidgetBrowserStatistics.cpp
  )
endif()

if (CHIPASS_ENABLE_BROWSER_PASSKEYS)
  target_sources(ChiPass_gui PRIVATE
    reports/ReportsWidgetPasskeys.cpp
    reports/ReportsPagePasskeys.cpp
    passkeys/PasskeyExporter.cpp
    passkeys/PasskeyExportDialog.cpp
    passkeys/PasskeyImporter.cpp
    passkeys/PasskeyImportDialog.cpp
  )
endif()

if (CHIPASS_ENABLE_NETWORKING)
  target_sources(ChiPass_gui PRIVATE
    UpdateCheckDialog.cpp
    IconDownloader.cpp
    IconDownloaderDialog.cpp

    updatecheck/UpdateChecker.cpp
  )
endif()

if (CHIPASS_ENABLE_YUBIKEY)
  target_sources(ChiPass_gui PRIVATE
    osutils/DeviceListener.cpp
    $<$<BOOL:${FREEDESKTOP}>:osutils/nixutils/DeviceListenerLibUsb.cpp>
    $<$<BOOL:${APPLE}>:osutils/macutils/DeviceListenerMac.cpp>
    $<$<BOOL:${WIN32}>:osutils/winutils/DeviceListenerWin.cpp>
  )
endif()

chipass_add_executable(ChiPass GUI
  ChiPass.cpp
)
target_link_libraries(ChiPass PRIVATE
  ChiPass_all
)


# TouchID feature tests
#
if (APPLE)
  # Deprecated in favor of kSecAccessControlBiometryCurrentSet.
  check_objcxx_source_compiles(
    [=[
      #include <Security/Security.h>

      int main() {
         return static_cast<int>(kSecAccessControlTouchIDCurrentSet);
      }
    ]=]
    HAVE_ACCESS_CONTROL_TOUCH_ID
  )

  check_objcxx_source_compiles(
    [=[
      #include <Security/Security.h>

      int main() {
        return static_cast<int>(kSecAccessControlBiometryCurrentSet);
      }
    ]=]
    HAVE_ACCESS_CONTROL_BIOMETRY
  )

  check_objcxx_source_compiles(
    [=[
      #include <Security/Security.h>

      int main() {
        return static_cast<int>(kSecAccessControlWatch);
      }
    ]=]
    HAVE_ACCESS_CONTROL_WATCH
  )

  set(definitions
    $<$<BOOL:${HAVE_ACCESS_CONTROL_BIOMETRY}>:HAVE_ACCESS_CONTROL_BIOMETRY>
    $<$<BOOL:${HAVE_ACCESS_CONTROL_TOUCH_ID}>:HAVE_ACCESS_CONTROL_TOUCH_ID>
    $<$<BOOL:${HAVE_ACCESS_CONTROL_WATCH}>:HAVE_ACCESS_CONTROL_WATCH>
  )
  set_source_files_properties(touchid/TouchID.mm PROPERTIES COMPILE_DEFINITIONS "${definitions}")
endif()
