/**
 * Input Validation Schemas
 * Uses Zod for runtime validation of GraphQL inputs
 */

import { z } from 'zod'

/**
 * Create Tenant Input Validation
 */
export const createTenantInputSchema = z.object({
  name: z.string().min(1).max(255),
  domain: z.string().max(255).optional(),
  tier: z.enum(['FREE', 'STANDARD', 'ENTERPRISE', 'SOVEREIGN']).optional(),
  metadata: z.record(z.unknown()).optional(),
  quotaLimits: z.object({
    compute: z.object({
      vcpu: z.number().int().positive().optional(),
      memory: z.number().int().positive().optional(),
      instances: z.number().int().positive().optional(),
    }).optional(),
    storage: z.object({
      total: z.number().int().positive().optional(),
      perInstance: z.number().int().positive().optional(),
    }).optional(),
    network: z.object({
      bandwidth: z.number().int().positive().optional(),
      egress: z.number().int().positive().optional(),
    }).optional(),
    custom: z.record(z.unknown()).optional(),
  }).optional(),
})

/**
 * Update Tenant Input Validation
 */
export const updateTenantInputSchema = z.object({
  name: z.string().min(1).max(255).optional(),
  domain: z.string().max(255).optional().nullable(),
  status: z.enum(['ACTIVE', 'SUSPENDED', 'DELETED', 'PENDING_ACTIVATION']).optional(),
  tier: z.enum(['FREE', 'STANDARD', 'ENTERPRISE', 'SOVEREIGN']).optional(),
  metadata: z.record(z.unknown()).optional(),
  quotaLimits: z.object({
    compute: z.object({
      vcpu: z.number().int().positive().optional(),
      memory: z.number().int().positive().optional(),
      instances: z.number().int().positive().optional(),
    }).optional(),
    storage: z.object({
      total: z.number().int().positive().optional(),
      perInstance: z.number().int().positive().optional(),
    }).optional(),
    network: z.object({
      bandwidth: z.number().int().positive().optional(),
      egress: z.number().int().positive().optional(),
    }).optional(),
    custom: z.record(z.unknown()).optional(),
  }).optional(),
})

/**
 * Budget Input Validation
 */
export const budgetInputSchema = z.object({
  name: z.string().min(1).max(255),
  amount: z.number().positive(),
  currency: z.string().length(3).optional(),
  period: z.enum(['DAILY', 'WEEKLY', 'MONTHLY', 'QUARTERLY', 'YEARLY']),
  startDate: z.string().datetime(),
  endDate: z.string().datetime().optional().nullable(),
  alertThresholds: z.array(z.number().min(0).max(100)).optional(),
  filters: z.record(z.unknown()).optional(),
})

/**
 * Billing Alert Input Validation
 */
export const billingAlertInputSchema = z.object({
  name: z.string().min(1).max(255),
  alertType: z.enum(['BUDGET', 'THRESHOLD', 'ANOMALY', 'FORECAST']),
  threshold: z.number().optional().nullable(),
  condition: z.record(z.unknown()),
  notificationChannels: z.array(z.string()).optional(),
  enabled: z.boolean().optional(),
})

/**
 * Resource Request Input Validation (for quota checks)
 */
export const resourceRequestInputSchema = z.object({
  compute: z.object({
    vcpu: z.number().int().positive().optional(),
    memory: z.number().int().positive().optional(),
    instances: z.number().int().positive().optional(),
  }).optional(),
  storage: z.object({
    size: z.number().int().positive().optional(),
  }).optional(),
  network: z.object({
    bandwidth: z.number().int().positive().optional(),
  }).optional(),
})

/**
 * Validate and sanitize input using schema
 */
export function validateInput<T>(schema: z.ZodSchema<T>, input: unknown): T {
  return schema.parse(input)
}

/**
 * Safe validation that returns errors instead of throwing
 */
export function safeValidateInput<T>(schema: z.ZodSchema<T>, input: unknown): { success: true; data: T } | { success: false; error: z.ZodError } {
  const result = schema.safeParse(input)
  if (result.success) {
    return { success: true, data: result.data }
  }
  return { success: false, error: result.error }
}

