/**
 * Real Tauri adapters wiring the UI ports to the backend via `@tauri-apps/api`.
 *
 * Only {@link TauriSystemGateway} is fully wired in L1 (to the `health`
 * command). The remaining gateways are skeletons that throw `NOT_IMPLEMENTED`
 * until their lots (L2–L9) land — they exist so the DI surface is complete and
 * the app can run real-mode without the mock substituting everything.
 */

import type { GatewayError } from "@/domain";
import type {
  Gateways,
  RemoteGateway,
} from "@/ports";
import { TauriSystemGateway } from "./system";
import { TauriAgentGateway } from "./agent";
import { TauriInputGateway } from "./input";
import { TauriProjectGateway } from "./project";
import { TauriTerminalGateway } from "./terminal";
import { TauriLayoutGateway } from "./layout";
import { TauriProfileGateway } from "./profile";
import { TauriModelServerGateway } from "./modelServer";
import { TauriDesktopServerGateway } from "./desktopServer";
import { TauriTemplateGateway } from "./template";
import { TauriSkillGateway } from "./skill";
import { TauriMemoryGateway } from "./memory";
import { TauriEmbedderGateway } from "./embedder";
import { TauriDeviceGateway } from "./device";
import { TauriGitGateway } from "./git";
import { TauriPermissionGateway } from "./permission";
import { TauriWorkStateGateway } from "./workState";
import { TauriConversationGateway } from "./conversation";
import { TauriTicketGateway } from "./ticket";
import { TauriWindowGateway } from "./window";
import { TauriFocusedProjectGateway } from "./focusedProject";
import { LocalStorageUiPreferencesGateway } from "./uiPreferences";
import { TauriPluginGateway } from "./plugin";
import { TauriPluginWorkspaceGateway } from "./pluginWorkspace";
import { TauriPluginTaskGateway } from "./pluginTask";
import { TauriPluginToolchainGateway } from "./pluginToolchain";
import { TauriPluginEventGateway } from "./pluginEvents";
import { TauriPluginConfigGateway } from "./pluginConfig";
import { TauriPluginStorageGateway } from "./pluginStorage";

function notImplemented(what: string): never {
  const err: GatewayError = {
    code: "NOT_IMPLEMENTED",
    message: `${what} is not implemented yet (pending its lot).`,
  };
  throw err;
}

class TauriRemoteGateway implements RemoteGateway {
  connect(): Promise<void> {
    return notImplemented("RemoteGateway.connect");
  }
}

/** Builds the full set of real Tauri-backed gateways. */
export function createTauriGateways(): Gateways {
  return {
    system: new TauriSystemGateway(),
    agent: new TauriAgentGateway(),
    input: new TauriInputGateway(),
    terminal: new TauriTerminalGateway(),
    project: new TauriProjectGateway(),
    layout: new TauriLayoutGateway(),
    git: new TauriGitGateway(),
    remote: new TauriRemoteGateway(),
    profile: new TauriProfileGateway(),
    modelServer: new TauriModelServerGateway(),
    desktopServer: new TauriDesktopServerGateway(),
    template: new TauriTemplateGateway(),
    skill: new TauriSkillGateway(),
    memory: new TauriMemoryGateway(),
    embedder: new TauriEmbedderGateway(),
    device: new TauriDeviceGateway(),
    permission: new TauriPermissionGateway(),
    workState: new TauriWorkStateGateway(),
    conversation: new TauriConversationGateway(),
    ticket: new TauriTicketGateway(),
    window: new TauriWindowGateway(),
    focusedProject: new TauriFocusedProjectGateway(),
    uiPreferences: new LocalStorageUiPreferencesGateway(),
    plugin: new TauriPluginGateway(),
    pluginWorkspace: new TauriPluginWorkspaceGateway(),
    pluginTask: new TauriPluginTaskGateway(),
    pluginToolchain: new TauriPluginToolchainGateway(),
    pluginEvents: new TauriPluginEventGateway(),
    pluginConfig: new TauriPluginConfigGateway(),
    pluginStorage: new TauriPluginStorageGateway(),
  };
}

export {
  TauriSystemGateway,
  TauriAgentGateway,
  TauriInputGateway,
  TauriProjectGateway,
  TauriTerminalGateway,
  TauriLayoutGateway,
  TauriProfileGateway,
  TauriModelServerGateway,
  TauriDesktopServerGateway,
  TauriTemplateGateway,
  TauriSkillGateway,
  TauriMemoryGateway,
  TauriEmbedderGateway,
  TauriDeviceGateway,
  TauriGitGateway,
  TauriPermissionGateway,
  TauriWorkStateGateway,
  TauriConversationGateway,
  TauriTicketGateway,
  TauriWindowGateway,
  TauriFocusedProjectGateway,
  LocalStorageUiPreferencesGateway,
  TauriPluginGateway,
  TauriPluginStorageGateway,
};
