/**
 * 中継（relay）とトークンのストアの出来事をログへ写す（指示書AY 段階10）。
 *
 * ★relay・tokens は logger を import しない★（tokens は proxy から、relay は時計を注入してテストする）ので、
 * 受け口だけを `globalThis` に登録しておき、ルートがここを呼んでつなぐ。何度呼んでもよい。
 * ★載せるのは件数・バイト数・固定の理由だけ★（ファイル名・file_id・トークン・制御盤の message は載せない。D12）。
 */
import { logEvent } from "@/lib/logger";
import type { SettingsStoreCorruptLogEvent } from "@/lib/logger/events";
import { setRelayEventSink, type RelayEvent } from "@/lib/ds-agent/relay";
import { setAgentTokenStoreWarnHandler } from "@/lib/ds-agent/tokens";

/** 制御盤から来た code を載せるときの長さの上限（段階10） */
export const AGENT_CODE_LOG_MAX_LENGTH = 64;

export function truncateAgentCode(code: string): string {
  return code.slice(0, AGENT_CODE_LOG_MAX_LENGTH);
}

function logRelayEvent(e: RelayEvent): void {
  switch (e.event) {
    case "ds_agent.connected":
    case "ds_agent.disconnected":
      logEvent("info", e);
      return;
    case "ds_logs.export_completed":
      logEvent("info", e);
      return;
    case "ds_logs.export_failed":
      logEvent("warn", e.agent_code === undefined ? e : { ...e, agent_code: truncateAgentCode(e.agent_code) });
      return;
  }
}

export function ensureDsAgentLogging(): void {
  if (globalThis.__dwatchDsAgentRelayEventSink !== logRelayEvent) setRelayEventSink(logRelayEvent);
  if (globalThis.__dwatchAgentTokenStoreWarn === undefined) {
    setAgentTokenStoreWarnHandler((info) => {
      const event: SettingsStoreCorruptLogEvent = {
        event: "settings.store_corrupt",
        file_path: info.filePath,
        backup_path: info.backupPath,
        reason: info.reason,
      };
      logEvent("warn", event);
    });
  }
}
