import {
  baseAppConfigSchema,
  databaseConfigSchema,
  logConfigSchema,
  serviceConfigSchema,
} from '@stock-bot/engine-config';
import { z } from 'zod';
import { featuresConfigSchema } from './features.schema';
import { providersConfigSchema } from './providers.schema';
import { scannerConfigSchema } from './scanner.schema';
import { workerConfigSchema } from './worker.schema';

// Service-specific configurations
const wcagServicesSchema = z.object({
  api: serviceConfigSchema.extend({
    port: z.number().default(3001),
    cors: z.object({
      enabled: z.boolean().default(true),
      origin: z.string().default('*'),
      credentials: z.boolean().default(true),
    }).default({}),
    rateLimit: z.object({
      enabled: z.boolean().default(true),
      windowMs: z.number().default(900000), // 15 minutes
      max: z.number().default(100),
      keyGenerator: z.enum(['ip', 'userId', 'apiKey']).default('userId'),
    }).default({}),
    pagination: z.object({
      defaultLimit: z.number().default(20),
      maxLimit: z.number().default(100),
    }).default({}),
  }),
  
  dashboard: serviceConfigSchema.extend({
    port: z.number().default(3000),
    apiUrl: z.string().default('http://localhost:3001'),
    publicUrl: z.string().default('http://localhost:3000'),
  }),
  
  worker: serviceConfigSchema.extend({
    port: z.number().default(3002), // For health checks
  }),
});

// Main WCAG application configuration schema
export const wcagAppConfigSchema = baseAppConfigSchema.extend({
  appName: z.literal('wcag-ada').default('wcag-ada'),
  
  // Core configurations
  log: logConfigSchema,
  database: databaseConfigSchema,
  
  // WCAG-specific configurations
  scanner: scannerConfigSchema,
  worker: workerConfigSchema,
  features: featuresConfigSchema,
  providers: providersConfigSchema,
  
  // Service configurations
  services: wcagServicesSchema.default({}),
  
  // Business logic configurations
  compliance: z.object({
    defaultLevel: z.object({
      standard: z.enum(['WCAG20', 'WCAG21', 'WCAG22']).default('WCAG21'),
      level: z.enum(['A', 'AA', 'AAA']).default('AA'),
    }).default({}),
    passingScore: z.object({
      A: z.number().min(0).max(100).default(95),
      AA: z.number().min(0).max(100).default(98),
      AAA: z.number().min(0).max(100).default(100),
    }).default({}),
    criticalCriteria: z.array(z.string()).default([
      '1.1.1', // Non-text Content
      '1.3.1', // Info and Relationships
      '1.4.3', // Contrast (Minimum)
      '2.1.1', // Keyboard
      '2.1.2', // No Keyboard Trap
      '2.4.1', // Bypass Blocks
      '2.4.2', // Page Titled
      '4.1.2', // Name, Role, Value
    ]),
  }).default({}),
  
  // Subscription/pricing tiers
  subscriptions: z.object({
    enabled: z.boolean().default(true),
    tiers: z.object({
      starter: z.object({
        websites: z.number().default(5),
        scansPerMonth: z.number().default(500),
        users: z.number().default(1),
        price: z.number().default(49),
      }).default({}),
      professional: z.object({
        websites: z.number().default(25),
        scansPerMonth: z.number().default(5000),
        users: z.number().default(5),
        price: z.number().default(149),
      }).default({}),
      enterprise: z.object({
        websites: z.number().default(-1), // Unlimited
        scansPerMonth: z.number().default(-1),
        users: z.number().default(-1),
        price: z.number().default(499),
      }).default({}),
    }).default({}),
  }).default({}),
});

export type WcagAppConfig = z.infer<typeof wcagAppConfigSchema>;