/**
 * @fileoverview Base handler interfaces and types for standardized handler patterns
 * @packageDocumentation
 */
import { DeepSourceClientFactory } from '../../client/factory.js';
import { Logger } from '../../utils/logging/logger.js';
import { ApiResponse } from '../../models/common.js';
/**
 * Base dependencies that all handlers require
 */
export interface BaseHandlerDeps {
    /** Factory for creating DeepSource API clients */
    clientFactory: DeepSourceClientFactory;
    /** Logger instance for the handler */
    logger: Logger;
    /** Function to retrieve the API key */
    getApiKey: () => string;
}
/**
 * Generic handler function type
 * @template TParams - The input parameters type
 * @template TResult - The result type (defaults to ApiResponse)
 */
export type HandlerFunction<TParams = unknown, TResult = ApiResponse> = TParams extends undefined ? () => Promise<TResult> : (params: TParams) => Promise<TResult>;
/**
 * Factory function type for creating handlers with dependencies
 * @template TDeps - The dependencies type (extends BaseHandlerDeps)
 * @template TParams - The handler parameters type
 * @template TResult - The handler result type
 */
export type HandlerFactory<TDeps extends BaseHandlerDeps = BaseHandlerDeps, TParams = unknown, TResult = ApiResponse> = (deps: TDeps) => HandlerFunction<TParams, TResult>;
/**
 * Handler configuration for registration
 */
export interface HandlerConfig<TParams = unknown> {
    /** The name of the handler/tool */
    name: string;
    /** Factory function to create the handler */
    factory: HandlerFactory<BaseHandlerDeps, TParams>;
    /** Optional custom dependencies (will be merged with base deps) */
    customDeps?: Partial<BaseHandlerDeps>;
}
/**
 * Result type for handlers that return structured data
 */
export interface HandlerResult<T> {
    /** The structured data */
    data: T;
    /** Optional metadata about the result */
    metadata?: {
        /** Total count of items (for paginated results) */
        totalCount?: number;
        /** Whether there are more pages */
        hasMore?: boolean;
        /** Cursor for next page */
        nextCursor?: string;
    };
}
/**
 * Error result type for standardized error handling
 */
export interface HandlerError {
    /** Error code for categorization */
    code: string;
    /** Human-readable error message */
    message: string;
    /** Additional error details */
    details?: Record<string, unknown>;
    /** Suggested actions for resolution */
    suggestions?: string[];
}
