/**
 * Standardized Response Schemas
 * Common response patterns used across all services
 */

import { z } from "zod";

/**
 * Standard success response
 */
export const successResponseSchema = z.object({
  success: z.boolean().default(true),
  message: z.string().optional(),
  timestamp: z.string().optional().default(() => new Date().toISOString()),
});

/**
 * Standard error response
 */
export const errorResponseSchema = z.object({
  success: z.boolean().default(false),
  error: z.string(),
  message: z.string().optional(),
  timestamp: z.string().optional().default(() => new Date().toISOString()),
});

/**
 * Health check response
 */
export const healthResponseSchema = z.object({
  status: z.enum(["healthy", "unhealthy"]),
  service: z.string(),
  version: z.string().optional(),
  timestamp: z.string().default(() => new Date().toISOString()),
  uptime: z.number().optional(),
  dependencies: z.record(z.string(), z.enum(["healthy", "unhealthy"])).optional(),
});

/**
 * Job response (for queue operations)
 */
export const jobResponseSchema = z.object({
  jobId: z.string(),
  status: z.enum(["queued", "processing", "completed", "failed"]).optional(),
  message: z.string().optional(),
  timestamp: z.string().default(() => new Date().toISOString()),
});

/**
 * Metadata response wrapper
 */
export const metadataResponseSchema = z.object({
  success: z.boolean(),
  metadata: z.record(z.string(), z.any()).optional(),
  error: z.string().optional(),
  timestamp: z.string().default(() => new Date().toISOString()),
});

/**
 * Performance metrics response
 */
export const performanceMetricsResponseSchema = z.object({
  totalRequests: z.number(),
  averageResponseTime: z.number(),
  successRate: z.number(),
  queueSize: z.number(),
  memoryUsage: z.object({
    rss: z.number(),
    heapTotal: z.number(),
    heapUsed: z.number(),
    external: z.number(),
    arrayBuffers: z.number(),
  }),
  uptime: z.number(),
  timestamp: z.string().default(() => new Date().toISOString()),
});

/**
 * Workflow status response
 */
export const workflowStatusResponseSchema = z.object({
  workflowId: z.string(),
  status: z.enum(["pending", "in_progress", "completed", "failed"]),
  currentStep: z.string().optional(),
  totalSteps: z.number().optional(),
  progress: z.number().optional().describe("Progress percentage (0-100)"),
  message: z.string().optional(),
  startTime: z.string().optional(),
  endTime: z.string().optional(),
  processingTime: z.number().optional(),
  nextSteps: z.string().optional(),
});

/**
 * File operation response
 */
export const fileOperationResponseSchema = z.object({
  success: z.boolean(),
  filePath: z.string().optional(),
  fileName: z.string().optional(),
  fileSize: z.number().optional(),
  mimeType: z.string().optional(),
  url: z.string().optional(),
  error: z.string().optional(),
  timestamp: z.string().default(() => new Date().toISOString()),
});

/**
 * Batch operation response
 */
export const batchOperationResponseSchema = z.object({
  success: z.boolean(),
  processedCount: z.number(),
  totalCount: z.number(),
  successCount: z.number(),
  failureCount: z.number(),
  batchId: z.string().optional(),
  errors: z.array(z.string()).optional(),
  processingTime: z.number(),
  timestamp: z.string().default(() => new Date().toISOString()),
}); 