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

export const GetHotFilesInput = z.object({
  limit: z.number().int().min(1).max(100).optional(),
});
export type GetHotFilesInputT = z.infer<typeof GetHotFilesInput>;

const DESCRIPTION =
  'Returns the most-imported files in the project, ranked by incoming import count. ' +
  'Hot files are high-risk change targets — many other files depend on them. ' +
  'Use to identify core modules and assess refactoring risk.';

export async function executeGetHotFiles(
  input: GetHotFilesInputT,
  projectPath: string,
  fetcher: typeof fetch = fetch,
): Promise<CodecontextResponse> {
  return callCodecontext(
    { toolName: 'get_hot_files', args: input.limit != null ? { limit: input.limit } : {}, projectPath },
    fetcher,
  );
}

export const getHotFiles: ToolDef<GetHotFilesInputT> = {
  name: 'get_hot_files',
  description: DESCRIPTION,
  inputSchema: GetHotFilesInput,
  jsonSchema: {
    type: 'function',
    function: {
      name: 'get_hot_files',
      description: DESCRIPTION,
      parameters: {
        type: 'object',
        properties: {
          limit: {
            type: 'number',
            description: 'Maximum number of files to return (default 20, max 100).',
          },
        },
        additionalProperties: false,
      },
    },
  },
  async execute(input, projectRoot) {
    return await executeGetHotFiles(input, projectRoot);
  },
};
