import Foundation

/// Centralized configuration constants for STT module.
/// All magic numbers and default values should be defined here.
///
/// NOTE: This file is mirrored in Android (android/src/main/java/.../STTConstants.kt).
/// Any changes here MUST be mirrored in Android to maintain platform parity.
/// Both files should have identical values and equivalent constant names.
enum STTConstants {

    // MARK: - Audio Processing

    /// Default sample rate in Hz
    static let defaultSampleRate = 16000

    /// VAD frame size in samples (10ms at 16kHz)
    static let vadHopSize = 160

    /// Maximum denoiser chunk size in samples (5 seconds at 16kHz)
    static let maxDenoiserChunkSamples = 5 * defaultSampleRate

    /// Chunk size for audio recording in milliseconds
    static let audioChunkSizeMs = 80

    /// Minimum peak amplitude to process STT (avoid noise hallucinations)
    static let minPeakForSTT: Float = 0.01

    /// Target peak amplitude for audio normalization
    static let targetPeakAmplitude: Float = 0.9

    // MARK: - VAD Defaults

    /// Default VAD speech probability threshold
    static let defaultVadThreshold: Float = 0.5

    /// Minimum speech duration in milliseconds to trigger recognition
    static let defaultMinSpeechMs = 300

    /// Minimum silence duration in milliseconds to end speech segment
    static let defaultMinSilenceMs = 500

    /// Maximum speech duration in milliseconds before forced segment break
    static let defaultMaxSpeechMs = 30000

    /// Padding around speech segments in milliseconds
    static let defaultSpeechPaddingMs = 100

    /// Threshold adjustment for aggressive VAD mode
    static let vadModeAggressiveAdjustment: Float = 0.15

    /// Threshold adjustment for sensitive VAD mode
    static let vadModeSensitiveAdjustment: Float = -0.15

    /// Maximum VAD threshold allowed
    static let vadThresholdMax: Float = 0.9

    /// Minimum VAD threshold allowed
    static let vadThresholdMin: Float = 0.1

    // MARK: - Diarization Defaults

    /// Default speaker similarity threshold for assignment (lenient)
    static let defaultSpeakerThreshold: Float = 0.55

    /// Default embedding similarity threshold for profile update (strict)
    static let defaultEmbeddingThreshold: Float = 0.70

    /// Maximum number of tracked speakers (LRU eviction)
    static let defaultMaxSpeakers = 10

    /// Minimum speech duration for speaker creation in milliseconds
    static let defaultMinSpeechDurationMs = 800

    /// Minimum speech duration for embedding update in milliseconds
    static let defaultMinEmbeddingUpdateMs = 500

    /// Weight for running average embedding update
    static let defaultEmbeddingAverageWeight: Float = 0.2

    /// Number of onboarding segments for first speaker stabilization
    static let defaultOnboardingSegments = 3

    /// Minimum accumulated speech before creating new speaker in milliseconds
    static let defaultMinSpeechForNewSpeaker = 3000

    /// Diarization window size for sub-segment processing in milliseconds
    static let diarizationWindowSizeMs = 1500

    /// Diarization window step (50% overlap) in milliseconds
    static let diarizationWindowStepMs = 750

    // MARK: - Streaming State

    /// Default confidence threshold for confirming volatile text
    static let defaultConfirmationThreshold: Float = 0.85

    /// Minimum audio context in milliseconds before confirmation
    static let defaultMinContextMs: Int64 = 5000

    // MARK: - Embedding Validation

    /// Minimum embedding norm for valid embedding
    static let minEmbeddingNorm: Float = 0.001

    /// Quality normalization factor for embedding variance
    static let embeddingQualityFactor: Float = 10.0

    // MARK: - Pyannote Defaults

    /// Default clustering threshold for auto speaker detection
    static let defaultClusteringThreshold: Float = 0.5

    /// Default minimum duration for speech segment in seconds
    static let defaultMinDurationOn: Float = 0.5

    /// Default minimum duration for silence segment in seconds
    static let defaultMinDurationOff: Float = 0.3

    // MARK: - Streaming Endpoint Detection

    /// Rule 1: Minimum trailing silence in seconds (longer pause detection)
    static let defaultRule1MinTrailingSilence: Float = 2.4

    /// Rule 2: Minimum trailing silence in seconds (shorter pause detection)
    static let defaultRule2MinTrailingSilence: Float = 1.2

    /// Rule 3: Minimum utterance length in seconds before endpoint
    static let defaultRule3MinUtteranceLength: Float = 20.0

    // MARK: - Model Inference

    /// Default number of threads for STT inference
    static let defaultSTTNumThreads = 4

    /// Default number of threads for embedding/denoiser inference
    static let defaultAuxiliaryNumThreads = 2

    /// Default ONNX runtime provider
    static let defaultProvider = "cpu"
}
