// v1.12 Track B.2: codecontext wrapper — get_symbol_info.

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

export const GetSymbolInfoInput = z.object({
  symbol_name: z.string().min(1),
  file_path: z.string().trim().optional(),
  framework_type: z.string().optional(),
});
export type GetSymbolInfoInputT = z.infer<typeof GetSymbolInfoInput>;

const DESCRIPTION =
  'Returns detailed information about a named symbol: definition location, kind (function/class/method/etc.), and (when known) framework-specific context (React component, Vue store, Angular service, …). ' +
  'Tree-sitter coverage: full for JS/Python/Java/Go/Rust/C++. TypeScript symbols are approximate (uses JS grammar). ' +
  'PHP and SQL are not supported — fall back to grep for those.';

export async function executeGetSymbolInfo(
  input: GetSymbolInfoInputT,
  projectPath: string,
  fetcher: typeof fetch = fetch,
): Promise<CodecontextResponse> {
  const args: Record<string, unknown> = { symbol_name: input.symbol_name };
  if (input.file_path) args['file_path'] = input.file_path;
  if (input.framework_type) args['framework_type'] = input.framework_type;
  return callCodecontext({ toolName: 'get_symbol_info', args, projectPath }, fetcher);
}

export const getSymbolInfo: ToolDef<GetSymbolInfoInputT> = {
  name: 'get_symbol_info',
  description: DESCRIPTION,
  inputSchema: GetSymbolInfoInput,
  jsonSchema: {
    type: 'function',
    function: {
      name: 'get_symbol_info',
      description: DESCRIPTION,
      parameters: {
        type: 'object',
        properties: {
          symbol_name: {
            type: 'string',
            description: 'The symbol name to look up (case-sensitive).',
          },
          file_path: {
            type: 'string',
            description: 'Narrow to a specific file when the symbol name is ambiguous.',
          },
          framework_type: {
            type: 'string',
            description: 'Hint for framework-specific extraction (react|vue|svelte|django|fastapi|express|nest|…).',
          },
        },
        required: ['symbol_name'],
        additionalProperties: false,
      },
    },
  },
  async execute(input, projectRoot) {
    return await executeGetSymbolInfo(input, projectRoot);
  },
};
