import { contextBridge, ipcRenderer } from "electron";
import type {
  AppConfig,
  ConfigPatch,
  DynastyLiveApi,
  ImportProbeResult
} from "../../packages/shared/src";

const api: DynastyLiveApi = {
  getConfig: () => ipcRenderer.invoke("config:get") as Promise<AppConfig>,
  updateConfig: (patch: ConfigPatch) =>
    ipcRenderer.invoke("config:update", patch) as Promise<AppConfig>,
  selectSaveFolder: () =>
    ipcRenderer.invoke("dialog:selectSaveFolder") as Promise<AppConfig>,
  selectSaveFile: () =>
    ipcRenderer.invoke("dialog:selectSaveFile") as Promise<AppConfig>,
  importLatest: () =>
    ipcRenderer.invoke("import:latest") as Promise<ImportProbeResult>,
  loadLatestSnapshot: () =>
    ipcRenderer.invoke("snapshot:latest") as Promise<ImportProbeResult | null>,
  importScreenshots: () =>
    ipcRenderer.invoke("screenshots:import") as ReturnType<DynastyLiveApi["importScreenshots"]>,
  loadScreenshots: () =>
    ipcRenderer.invoke("screenshots:list") as ReturnType<DynastyLiveApi["loadScreenshots"]>,
  updateScreenshotType: (id, screenshotType) =>
    ipcRenderer.invoke(
      "screenshots:updateType",
      id,
      screenshotType
    ) as ReturnType<DynastyLiveApi["updateScreenshotType"]>,
  loadScreenshotExtractions: () =>
    ipcRenderer.invoke(
      "screenshots:extractions:list"
    ) as ReturnType<DynastyLiveApi["loadScreenshotExtractions"]>,
  createScreenshotExtraction: (screenshotId) =>
    ipcRenderer.invoke(
      "screenshots:extractions:create",
      screenshotId
    ) as ReturnType<DynastyLiveApi["createScreenshotExtraction"]>,
  updateScreenshotExtractionText: (id, text) =>
    ipcRenderer.invoke(
      "screenshots:extractions:updateText",
      id,
      text
    ) as ReturnType<DynastyLiveApi["updateScreenshotExtractionText"]>,
  updateScreenshotExtractionRows: (id, rows) =>
    ipcRenderer.invoke(
      "screenshots:extractions:updateRows",
      id,
      rows
    ) as ReturnType<DynastyLiveApi["updateScreenshotExtractionRows"]>,
  runScreenshotExtractionOcr: (id) =>
    ipcRenderer.invoke(
      "screenshots:extractions:runOcr",
      id
    ) as ReturnType<DynastyLiveApi["runScreenshotExtractionOcr"]>,
  parseScreenshotExtractionRows: (id, targetGameRow) =>
    ipcRenderer.invoke(
      "screenshots:extractions:parseRows",
      id,
      targetGameRow
    ) as ReturnType<DynastyLiveApi["parseScreenshotExtractionRows"]>,
  approveScreenshotHighlights: (extractionId, gameRow, snapshotId) =>
    ipcRenderer.invoke(
      "screenshots:highlights:approve",
      extractionId,
      gameRow,
      snapshotId
    ) as ReturnType<DynastyLiveApi["approveScreenshotHighlights"]>,
  approveScreenshotStats: (extractionId, gameRow, snapshotId) =>
    ipcRenderer.invoke(
      "screenshots:stats:approve",
      extractionId,
      gameRow,
      snapshotId
    ) as ReturnType<DynastyLiveApi["approveScreenshotStats"]>,
  loadPlayHighlights: (snapshotId, gameRow) =>
    ipcRenderer.invoke(
      "highlights:list",
      snapshotId,
      gameRow
    ) as ReturnType<DynastyLiveApi["loadPlayHighlights"]>,
  loadScreenshotStats: (snapshotId, gameRow) =>
    ipcRenderer.invoke(
      "screenshots:stats:list",
      snapshotId,
      gameRow
    ) as ReturnType<DynastyLiveApi["loadScreenshotStats"]>,
  getAiSettings: () =>
    ipcRenderer.invoke("ai:settings:get") as ReturnType<DynastyLiveApi["getAiSettings"]>,
  updateAiSettings: (patch) =>
    ipcRenderer.invoke(
      "ai:settings:update",
      patch
    ) as ReturnType<DynastyLiveApi["updateAiSettings"]>,
  testAiConnection: () =>
    ipcRenderer.invoke(
      "ai:connection:test"
    ) as ReturnType<DynastyLiveApi["testAiConnection"]>,
  loadAiPromptPacks: () =>
    ipcRenderer.invoke(
      "ai:promptPacks:list"
    ) as ReturnType<DynastyLiveApi["loadAiPromptPacks"]>,
  loadAiPromptTemplates: () =>
    ipcRenderer.invoke(
      "ai:promptTemplates:list"
    ) as ReturnType<DynastyLiveApi["loadAiPromptTemplates"]>,
  saveAiPromptTemplate: (id, template) =>
    ipcRenderer.invoke(
      "ai:promptTemplates:save",
      id,
      template
    ) as ReturnType<DynastyLiveApi["saveAiPromptTemplate"]>,
  generateAiArtifact: (request) =>
    ipcRenderer.invoke(
      "ai:artifacts:generate",
      request
    ) as ReturnType<DynastyLiveApi["generateAiArtifact"]>,
  loadAiArtifacts: (snapshotId, gameRow) =>
    ipcRenderer.invoke(
      "ai:artifacts:list",
      snapshotId,
      gameRow
    ) as ReturnType<DynastyLiveApi["loadAiArtifacts"]>,
  updateAiArtifact: (id, content) =>
    ipcRenderer.invoke(
      "ai:artifacts:update",
      id,
      content
    ) as ReturnType<DynastyLiveApi["updateAiArtifact"]>
};

contextBridge.exposeInMainWorld("dynastyLive", api);
