import { Injectable } from '@nestjs/common';
import { ToolExecutionResult, ToolDefinition, ToolContext } from './tool.types';
import { LokiClient } from '../../outbound/loki/loki.client';

type LokiQueryArgs = {
  query: string;
  time?: string;
  limit?: number;
};

@Injectable()
export class LokiQueryUsecase {
  constructor(private readonly lokiClient: LokiClient) {}

  definition(): ToolDefinition {
    return {
      name: 'loki.query',
      description: 'Run an instant LogQL query against Loki.',
      inputSchema: {
        type: 'object',
        properties: {
          query: { type: 'string', description: 'LogQL query' },
          time: { type: 'string', description: 'RFC3339 or epoch' },
          limit: { type: 'integer', minimum: 1, maximum: 5000 },
        },
        required: ['query'],
        additionalProperties: false,
      },
      handler: async (args, context) => this.execute(args, context),
    };
  }

  async execute(args: unknown, _context: ToolContext): Promise<ToolExecutionResult> {
    const typedArgs = (args ?? {}) as LokiQueryArgs;

    try {
      const payload = await this.lokiClient.query({
        query: typedArgs.query,
        time: typedArgs.time,
        limit: typedArgs.limit,
      });

      return {
        output: [
          {
            kind: 'text',
            text: JSON.stringify(payload, null, 2),
          },
        ],
        isError: false,
      };
    } catch (error) {
      const details = error instanceof Error ? error.message : String(error);
      return {
        output: [{ kind: 'text', text: `loki.query failed: ${details}` }],
        isError: true,
      };
    }
  }
}
