/**
 * Input Validation Types
 * Defines interfaces and types for comprehensive input validation and sanitization
 */

export interface ValidationRule {
  name: string;
  validate: (value: any) => boolean;
  message: string;
  sanitize?: (value: any) => any;
}

export interface ValidationSchema {
  [field: string]: ValidationRule[];
}

export interface ValidationResult {
  isValid: boolean;
  errors: ValidationError[];
  sanitizedData: Record<string, any>;
}

export interface ValidationError {
  field: string;
  rule: string;
  message: string;
  value: any;
}

export interface SanitizationOptions {
  stripHtml?: boolean;
  escapeHtml?: boolean;
  trimWhitespace?: boolean;
  normalizeUnicode?: boolean;
  maxLength?: number;
  allowedChars?: RegExp;
  blockedPatterns?: RegExp[];
}

export interface PathValidationOptions {
  allowAbsolute?: boolean;
  allowRelative?: boolean;
  allowedExtensions?: string[];
  blockedExtensions?: string[];
  maxDepth?: number;
  basePath?: string;
}

export interface RateLimitOptions {
  windowMs: number;
  maxRequests: number;
  keyGenerator?: (req: any) => string;
  skipSuccessfulRequests?: boolean;
  skipFailedRequests?: boolean;
  onLimitReached?: (req: any) => void;
}

export interface RateLimitStore {
  get(key: string): Promise<number | null>;
  set(key: string, value: number, ttl: number): Promise<void>;
  increment(key: string, ttl: number): Promise<number>;
  reset(key: string): Promise<void>;
}

export interface SqlInjectionPattern {
  pattern: RegExp;
  severity: 'low' | 'medium' | 'high' | 'critical';
  description: string;
}

export interface InputValidatorConfig {
  enableSqlInjectionPrevention?: boolean;
  enablePathTraversalPrevention?: boolean;
  enableXssProtection?: boolean;
  enableRateLimiting?: boolean;
  customRules?: ValidationRule[];
  sanitizationDefaults?: SanitizationOptions;
}
