/**
 * Example demonstrating the use of the graceful degradation mechanism
 */

import {
  ServiceQualityLevel,
  FeaturePriority,
  DegradationManager,
  FeatureToggle,
  MarineEnvironmentStatus,
  OperationalContext
} from '../index';

/**
 * Example feature toggle for a high-resolution chart display
 */
const highResChartFeature: FeatureToggle = {
  id: 'high-res-charts',
  name: 'High Resolution Charts',
  description: 'Displays charts in high resolution with detailed rendering',
  priority: FeaturePriority.USEFUL,
  enabled: true,
  manualToggleAllowed: true,
  powerConsumption: 5, // watts
  cpuUsage: 15, // percentage
  memoryUsage: 250, // MB
  bandwidthUsage: 50, // KB/s
  storageIops: 20,
  marineSettings: {
    requiredInRoughSeas: false,
    requiredForNavigation: false,
    requiredForSafety: false,
    requiresGoodConnectivity: true
  }
};

/**
 * Example feature toggle for weather data updates
 */
const weatherUpdatesFeature: FeatureToggle = {
  id: 'weather-updates',
  name: 'Weather Data Updates',
  description: 'Fetches and displays real-time weather data',
  priority: FeaturePriority.IMPORTANT,
  enabled: true,
  manualToggleAllowed: true,
  powerConsumption: 3, // watts
  cpuUsage: 5, // percentage
  memoryUsage: 100, // MB
  bandwidthUsage: 30, // KB/s
  storageIops: 10,
  marineSettings: {
    requiredInRoughSeas: true,
    requiredForNavigation: true,
    requiredForSafety: false,
    requiresGoodConnectivity: true
  }
};

/**
 * Example feature toggle for collision avoidance system
 */
const collisionAvoidanceFeature: FeatureToggle = {
  id: 'collision-avoidance',
  name: 'Collision Avoidance System',
  description: 'Monitors surroundings and alerts for potential collisions',
  priority: FeaturePriority.CRITICAL,
  enabled: true,
  manualToggleAllowed: false,
  powerConsumption: 8, // watts
  cpuUsage: 20, // percentage
  memoryUsage: 150, // MB
  bandwidthUsage: 5, // KB/s
  storageIops: 30,
  marineSettings: {
    requiredInRoughSeas: true,
    requiredForNavigation: true,
    requiredForSafety: true,
    requiresGoodConnectivity: false
  }
};

/**
 * Example feature toggle for entertainment system
 */
const entertainmentFeature: FeatureToggle = {
  id: 'entertainment',
  name: 'Entertainment System',
  description: 'Music, videos, and other entertainment content',
  priority: FeaturePriority.COMFORT,
  enabled: true,
  manualToggleAllowed: true,
  powerConsumption: 15, // watts
  cpuUsage: 25, // percentage
  memoryUsage: 500, // MB
  bandwidthUsage: 200, // KB/s
  storageIops: 50,
  marineSettings: {
    requiredInRoughSeas: false,
    requiredForNavigation: false,
    requiredForSafety: false,
    requiresGoodConnectivity: false
  }
};

/**
 * Example of normal sailing conditions
 */
async function normalSailingExample(): Promise<void> {
  console.log('=== Normal Sailing Conditions Example ===');
  
  // Create degradation manager
  const degradationManager = new DegradationManager();
  
  // Register features
  degradationManager.registerFeature(highResChartFeature);
  degradationManager.registerFeature(weatherUpdatesFeature);
  degradationManager.registerFeature(collisionAvoidanceFeature);
  degradationManager.registerFeature(entertainmentFeature);
  
  // Set up normal sailing environment
  const environment: MarineEnvironmentStatus = {
    seaState: 'calm',
    weather: 'clear',
    windSpeed: 10,
    temperature: 22,
    powerStatus: 'normal',
    connectivityQuality: 0.9,
    expectedFailureRate: 1.0,
    recommendedTimeoutMultiplier: 1.0,
    criticalOperationsOnly: false
  };
  
  // Update environment
  degradationManager.updateMarineEnvironment(environment);
  
  // Check feature status
  console.log('Quality Level:', degradationManager.getQualityLevel());
  console.log('High-Res Charts enabled:', degradationManager.isFeatureEnabled('high-res-charts'));
  console.log('Weather Updates enabled:', degradationManager.isFeatureEnabled('weather-updates'));
  console.log('Collision Avoidance enabled:', degradationManager.isFeatureEnabled('collision-avoidance'));
  console.log('Entertainment enabled:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Show metrics
  console.log('Resource usage:', degradationManager.getMetrics().resourceUsage);
}

/**
 * Example of rough seas with limited connectivity
 */
async function roughSeasExample(): Promise<void> {
  console.log('\n=== Rough Seas with Limited Connectivity Example ===');
  
  // Create degradation manager
  const degradationManager = new DegradationManager();
  
  // Register features
  degradationManager.registerFeature(highResChartFeature);
  degradationManager.registerFeature(weatherUpdatesFeature);
  degradationManager.registerFeature(collisionAvoidanceFeature);
  degradationManager.registerFeature(entertainmentFeature);
  
  // Set up rough seas environment
  const environment: MarineEnvironmentStatus = {
    seaState: 'rough',
    weather: 'storm',
    windSpeed: 30,
    temperature: 15,
    powerStatus: 'normal',
    connectivityQuality: 0.2, // Poor connectivity
    expectedFailureRate: 2.0,
    recommendedTimeoutMultiplier: 1.5,
    criticalOperationsOnly: false
  };
  
  // Update environment
  degradationManager.updateMarineEnvironment(environment);
  
  // Check feature status
  console.log('Quality Level:', degradationManager.getQualityLevel());
  console.log('High-Res Charts enabled:', degradationManager.isFeatureEnabled('high-res-charts'));
  console.log('Weather Updates enabled:', degradationManager.isFeatureEnabled('weather-updates'));
  console.log('Collision Avoidance enabled:', degradationManager.isFeatureEnabled('collision-avoidance'));
  console.log('Entertainment enabled:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Show metrics
  console.log('Resource usage:', degradationManager.getMetrics().resourceUsage);
}

/**
 * Example of power conservation mode
 */
async function powerConservationExample(): Promise<void> {
  console.log('\n=== Power Conservation Mode Example ===');
  
  // Create degradation manager
  const degradationManager = new DegradationManager();
  
  // Register features
  degradationManager.registerFeature(highResChartFeature);
  degradationManager.registerFeature(weatherUpdatesFeature);
  degradationManager.registerFeature(collisionAvoidanceFeature);
  degradationManager.registerFeature(entertainmentFeature);
  
  // Set up power conservation environment
  const environment: MarineEnvironmentStatus = {
    seaState: 'moderate',
    weather: 'cloudy',
    windSpeed: 15,
    temperature: 18,
    powerStatus: 'conservation', // Power conservation mode
    connectivityQuality: 0.7,
    expectedFailureRate: 1.2,
    recommendedTimeoutMultiplier: 1.2,
    criticalOperationsOnly: false
  };
  
  // Update environment
  degradationManager.updateMarineEnvironment(environment);
  
  // Check feature status
  console.log('Quality Level:', degradationManager.getQualityLevel());
  console.log('High-Res Charts enabled:', degradationManager.isFeatureEnabled('high-res-charts'));
  console.log('Weather Updates enabled:', degradationManager.isFeatureEnabled('weather-updates'));
  console.log('Collision Avoidance enabled:', degradationManager.isFeatureEnabled('collision-avoidance'));
  console.log('Entertainment enabled:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Show metrics
  console.log('Resource usage:', degradationManager.getMetrics().resourceUsage);
}

/**
 * Example of emergency mode
 */
async function emergencyModeExample(): Promise<void> {
  console.log('\n=== Emergency Mode Example ===');
  
  // Create degradation manager
  const degradationManager = new DegradationManager();
  
  // Register features
  degradationManager.registerFeature(highResChartFeature);
  degradationManager.registerFeature(weatherUpdatesFeature);
  degradationManager.registerFeature(collisionAvoidanceFeature);
  degradationManager.registerFeature(entertainmentFeature);
  
  // Set up emergency environment
  const environment: MarineEnvironmentStatus = {
    seaState: 'very_rough',
    weather: 'storm',
    windSpeed: 45,
    temperature: 10,
    powerStatus: 'critical',
    connectivityQuality: 0.1,
    expectedFailureRate: 3.0,
    recommendedTimeoutMultiplier: 0.5,
    criticalOperationsOnly: true // Emergency mode
  };
  
  // Update environment
  degradationManager.updateMarineEnvironment(environment);
  
  // Check feature status
  console.log('Quality Level:', degradationManager.getQualityLevel());
  console.log('High-Res Charts enabled:', degradationManager.isFeatureEnabled('high-res-charts'));
  console.log('Weather Updates enabled:', degradationManager.isFeatureEnabled('weather-updates'));
  console.log('Collision Avoidance enabled:', degradationManager.isFeatureEnabled('collision-avoidance'));
  console.log('Entertainment enabled:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Show metrics
  console.log('Resource usage:', degradationManager.getMetrics().resourceUsage);
}

/**
 * Example of manual quality level setting
 */
async function manualQualityLevelExample(): Promise<void> {
  console.log('\n=== Manual Quality Level Setting Example ===');
  
  // Create degradation manager
  const degradationManager = new DegradationManager();
  
  // Register features
  degradationManager.registerFeature(highResChartFeature);
  degradationManager.registerFeature(weatherUpdatesFeature);
  degradationManager.registerFeature(collisionAvoidanceFeature);
  degradationManager.registerFeature(entertainmentFeature);
  
  // Set up normal environment
  const environment: MarineEnvironmentStatus = {
    seaState: 'calm',
    weather: 'clear',
    windSpeed: 10,
    temperature: 22,
    powerStatus: 'normal',
    connectivityQuality: 0.9,
    expectedFailureRate: 1.0,
    recommendedTimeoutMultiplier: 1.0,
    criticalOperationsOnly: false
  };
  
  // Update environment
  degradationManager.updateMarineEnvironment(environment);
  
  // Check initial feature status
  console.log('Initial Quality Level:', degradationManager.getQualityLevel());
  console.log('Initial Entertainment enabled:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Manually set quality level to MINIMAL
  console.log('\nManually setting quality level to MINIMAL...');
  degradationManager.setQualityLevel(ServiceQualityLevel.MINIMAL);
  
  // Check feature status after manual change
  console.log('New Quality Level:', degradationManager.getQualityLevel());
  console.log('Entertainment enabled after change:', degradationManager.isFeatureEnabled('entertainment'));
  
  // Show metrics
  console.log('Resource usage:', degradationManager.getMetrics().resourceUsage);
}

/**
 * Run all examples
 */
async function runAllExamples(): Promise<void> {
  await normalSailingExample();
  await roughSeasExample();
  await powerConservationExample();
  await emergencyModeExample();
  await manualQualityLevelExample();
}

// Run the examples
runAllExamples().catch(console.error);
