// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
//
// SPDX-License-Identifier: GPL-3.0-or-later

import type { AgentEvent } from "@mariozechner/pi-agent-core";

const MAX_OUTPUT_LINES = 20;

export interface OutputOptions {
  verbose: boolean;
}

export function formatToolOutput(output: string): string {
  const lines = output.split(/\r?\n/);
  if (lines.length <= MAX_OUTPUT_LINES) {
    return output;
  }

  const truncated = lines.slice(0, MAX_OUTPUT_LINES).join("\n");
  return `${truncated}\n(+${lines.length - MAX_OUTPUT_LINES} more lines)`;
}

export function createEventLogger(options: OutputOptions) {
  return (event: AgentEvent) => {
    if (!options.verbose) return;

    if (event.type === "tool_execution_start") {
      console.error(`\n[tool] ${event.toolName}`);
      console.error(JSON.stringify(event.args, null, 2));
    }

    if (event.type === "tool_execution_end") {
      if (event.isError) {
        console.error("[tool error]");
        console.error(String(event.result));
        return;
      }

      const text = (event.result?.content ?? [])
        .filter((content: { type: string }) => content.type === "text")
        .map((content: { text?: string }) => content.text ?? "")
        .join("");

      if (text) {
        console.error(formatToolOutput(text));
      }
    }
  };
}

export function printUsageSummary(
  usage: { cost?: { total?: number }; totalTokens?: number; output?: number; input?: number } | undefined,
  requestCount?: number,
) {
  if (!usage) return;

  const tokens = usage.totalTokens ?? (usage.output ?? 0) + (usage.input ?? 0);
  const rawCost = usage.cost?.total;
  const cost = typeof rawCost === "number" && !isNaN(rawCost) && rawCost > 0 ? rawCost : undefined;

  let line = `\nusage: ${tokens} tokens`;
  if (requestCount !== undefined && requestCount > 0) {
    line += ` across ${requestCount} ${requestCount === 1 ? "request" : "requests"}`;
  }
  if (cost !== undefined) {
    line += `, cost $${cost.toFixed(4)}`;
  }
  console.error(line);
}
