/**
 * GPS Recovery Policy
 * Defines recovery policies for GPS health issues
 */

import {
  RecoveryPolicy,
  RecoveryPriority
} from '../RecoveryAction';

import {
  HealthStatus,
  OperationalContext,
  MarineSystemType
} from '../../types';

/**
 * Create a GPS recovery policy for poor satellite reception
 */
export function createGPSSatelliteRecoveryPolicy(): RecoveryPolicy {
  return {
    policyId: 'gps-satellite-recovery',
    name: 'GPS Satellite Reception Recovery',
    checkId: 'gps-health',
    marineSystemType: MarineSystemType.NAVIGATION,
    triggerStatus: HealthStatus.UNHEALTHY,
    triggerScore: 0.4, // Trigger when health score drops below 0.4
    consecutiveFailures: 2, // Require 2 consecutive failures before triggering
    actions: [
      'gps-recalibration', // First try recalibration
      'gps-failover'       // Then try failover to backup GPS
    ],
    stopOnSuccess: true, // Stop after first successful action
    enabled: true,
    cooldownPeriod: 300000, // 5 minutes between recovery attempts
    maxAttempts: 3,
    attemptWindow: 3600000, // 1 hour
    marineSettings: {
      activeContexts: [
        OperationalContext.SAILING,
        OperationalContext.MOTORING,
        OperationalContext.ANCHORED,
        OperationalContext.DOCKED
      ],
      activeInRoughSeas: true,
      powerAware: true,
      safetyImpact: true
    }
  };
}

/**
 * Create a GPS recovery policy for position jumps
 */
export function createGPSPositionJumpRecoveryPolicy(): RecoveryPolicy {
  return {
    policyId: 'gps-position-jump-recovery',
    name: 'GPS Position Jump Recovery',
    checkId: 'gps-health',
    marineSystemType: MarineSystemType.NAVIGATION,
    triggerStatus: HealthStatus.DEGRADED,
    triggerScore: 0.6, // Trigger when health score drops below 0.6
    consecutiveFailures: 1, // Immediate action on position jumps
    actions: [
      'gps-recalibration',
      'gps-failover'
    ],
    stopOnSuccess: true,
    enabled: true,
    cooldownPeriod: 60000, // 1 minute between recovery attempts
    maxAttempts: 5,
    attemptWindow: 1800000, // 30 minutes
    marineSettings: {
      activeContexts: [
        OperationalContext.SAILING,
        OperationalContext.MOTORING,
        OperationalContext.ANCHORED
      ],
      activeInRoughSeas: true,
      powerAware: false, // Position jumps are critical enough to ignore power status
      safetyImpact: true
    }
  };
}

/**
 * Create a GPS recovery policy for critical failures
 */
export function createGPSCriticalRecoveryPolicy(): RecoveryPolicy {
  return {
    policyId: 'gps-critical-recovery',
    name: 'GPS Critical Failure Recovery',
    checkId: 'gps-health',
    marineSystemType: MarineSystemType.NAVIGATION,
    triggerStatus: HealthStatus.CRITICAL,
    triggerScore: 0.2, // Very low health score
    consecutiveFailures: 1, // Immediate action on critical failures
    actions: [
      'gps-failover',       // Try failover first for critical issues
      'gps-recalibration',  // Then try recalibration
      'gps-reset'           // Last resort: full reset
    ],
    stopOnSuccess: true,
    enabled: true,
    cooldownPeriod: 30000, // 30 seconds between recovery attempts
    maxAttempts: 10,
    attemptWindow: 600000, // 10 minutes
    marineSettings: {
      activeContexts: [
        OperationalContext.SAILING,
        OperationalContext.MOTORING,
        OperationalContext.ANCHORED,
        OperationalContext.DOCKED,
        OperationalContext.EMERGENCY
      ],
      activeInRoughSeas: true,
      powerAware: false, // Critical GPS failures must be addressed regardless of power
      safetyImpact: true
    }
  };
}

/**
 * Register all GPS recovery policies with the recovery orchestrator
 */
export function registerGPSRecoveryPolicies(
  registerPolicy: (policy: RecoveryPolicy) => void
): void {
  registerPolicy(createGPSSatelliteRecoveryPolicy());
  registerPolicy(createGPSPositionJumpRecoveryPolicy());
  registerPolicy(createGPSCriticalRecoveryPolicy());
}
