import { z } from 'zod';

// Common service configuration
export const serviceConfigSchema = z.object({
  name: z.string(),
  serviceName: z.string().optional(), // Standard service name (kebab-case)
  port: z.number().min(1).max(65535),
  host: z.string().default('0.0.0.0'),
  healthCheckPath: z.string().default('/health'),
  metricsPath: z.string().default('/metrics'),
  shutdownTimeout: z.number().default(30000),
  cors: z
    .object({
      enabled: z.boolean().default(true),
      origin: z.union([z.string(), z.array(z.string())]).default('*'),
      credentials: z.boolean().default(true),
    })
    .default({}),
});

// Logging configuration
export const loggingConfigSchema = z.object({
  level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).default('info'),
  format: z.enum(['json', 'pretty']).default('json'),
  hideObject: z.boolean().default(false),
  loki: z
    .object({
      enabled: z.boolean().default(false),
      host: z.string().default('localhost'),
      port: z.number().default(3100),
      labels: z.record(z.string()).default({}),
    })
    .optional(),
});

// Queue configuration
export const queueConfigSchema = z.object({
  enabled: z.boolean().default(true),
  redis: z.object({
    host: z.string().default('localhost'),
    port: z.number().default(6379),
    password: z.string().optional(),
    db: z.number().default(1),
  }),
  workers: z.number().default(1),
  concurrency: z.number().default(1),
  enableScheduledJobs: z.boolean().default(true),
  defaultJobOptions: z
    .object({
      attempts: z.number().default(3),
      backoff: z
        .object({
          type: z.enum(['exponential', 'fixed']).default('exponential'),
          delay: z.number().default(1000),
        })
        .default({}),
      removeOnComplete: z.number().default(100),
      removeOnFail: z.number().default(100),
      timeout: z.number().optional(),
    })
    .default({}),
});

// HTTP client configuration
export const httpConfigSchema = z.object({
  timeout: z.number().default(30000),
  retries: z.number().default(3),
  retryDelay: z.number().default(1000),
  userAgent: z.string().optional(),
  proxy: z
    .object({
      enabled: z.boolean().default(false),
      url: z.string().url().optional(),
      auth: z
        .object({
          username: z.string(),
          password: z.string(),
        })
        .optional(),
    })
    .optional(),
});

// WebShare proxy service configuration
export const webshareConfigSchema = z.object({
  apiKey: z.string().optional(),
  apiUrl: z.string().default('https://proxy.webshare.io/api/v2/'),
  enabled: z.boolean().default(true),
});

// Browser configuration
export const browserConfigSchema = z.object({
  headless: z.boolean().default(true),
  timeout: z.number().default(30000),
});

// Proxy manager configuration
export const proxyConfigSchema = z.object({
  enabled: z.boolean().default(false),
  cachePrefix: z.string().default('proxy:'),
  ttl: z.number().default(3600),
  webshare: z
    .object({
      apiKey: z.string(),
      apiUrl: z.string().default('https://proxy.webshare.io/api/v2/'),
    })
    .optional(),
});
