import assert from "node:assert/strict";
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { RepoScanner } from "../packages/sdk/src/repopilot/scanner/scanner";
import { EdgeType, NodeType } from "../packages/sdk/src/repopilot/types";

const tempRoot = mkdtempSync(join(tmpdir(), "repopilot-wiki-smoke-"));

try {
  const srcDir = join(tempRoot, "src", "com", "example");
  mkdirSync(srcDir, { recursive: true });

  writeFileSync(
    join(srcDir, "ExampleService.java"),
    `package com.example;

public class ExampleService {
  public void start() {
    helper();
  }

  private void helper() {
    System.out.println("ok");
  }
}
`,
  );

  const scanner = new RepoScanner(tempRoot);
  const index = scanner.scan();
  const methods = index.graph.getNodesByType(NodeType.METHOD);
  assert.equal(methods.length, 2, "expected two methods to be indexed");

  const callEdges = index.graph.getEdges(EdgeType.CALLS).filter((edge) => !String(edge.target).startsWith("method_ref:"));
  assert.ok(callEdges.length >= 1, "expected at least one resolved CALLS edge");

  const packageNodes = index.graph.getNodesByType(NodeType.PACKAGE);
  assert.equal(packageNodes.length, 1, "expected package node to be indexed");

  console.log("wiki smoke passed");
} finally {
  rmSync(tempRoot, { recursive: true, force: true });
}
