import { z } from 'zod';
import type { ToolDef } from '../../tools.js';
import { callCodecontext, type CodecontextResponse } from '../../codecontext_client.js';

export const GetRoutesInput = z.object({
  framework: z.string().trim().optional(),
});
export type GetRoutesInputT = z.infer<typeof GetRoutesInput>;

const DESCRIPTION =
  'Extracts HTTP routes from the project via tree-sitter AST analysis. ' +
  'Detects Fastify and Express route registrations (app.get, app.post, app.route, router.use, etc.) ' +
  'with method, path, file, line number, and inferred tags (db, auth, cache). ' +
  'Optional framework filter narrows to "fastify" or "express".';

export async function executeGetRoutes(
  input: GetRoutesInputT,
  projectPath: string,
  fetcher: typeof fetch = fetch,
): Promise<CodecontextResponse> {
  const args: Record<string, unknown> = {};
  if (input.framework) args.framework = input.framework;
  return callCodecontext({ toolName: 'get_routes', args, projectPath }, fetcher);
}

export const getRoutes: ToolDef<GetRoutesInputT> = {
  name: 'get_routes',
  description: DESCRIPTION,
  inputSchema: GetRoutesInput,
  jsonSchema: {
    type: 'function',
    function: {
      name: 'get_routes',
      description: DESCRIPTION,
      parameters: {
        type: 'object',
        properties: {
          framework: {
            type: 'string',
            description: 'Filter to a specific framework: "fastify" or "express". Omit for all.',
          },
        },
        additionalProperties: false,
      },
    },
  },
  async execute(input, projectRoot) {
    return await executeGetRoutes(input, projectRoot);
  },
};
