import Foundation

/// GNX Earsling iOS/Swift SDK Contract.
/// This contract transports candidate-status decisions only.
/// It must not be presented as a body-temperature, heart-rate, rhythm, or blood-pressure measurement output.

public enum EarslingMetric: String, Codable {
    case bodyTemperature = "body_temperature"
    case heartRhythm = "heart_rhythm"
    case bloodPressureRange = "blood_pressure_range"
}

public enum EarslingDecision: String, Codable {
    case greenNormal = "GREEN_NORMAL"
    case amberCheck = "AMBER_CHECK"
    case orangeOutOfRange = "ORANGE_OUT_OF_RANGE"
    case redSevereRecheck = "RED_SEVERE_RECHECK"
    case grayContextInvalid = "GRAY_CONTEXT_INVALID"
}

public struct EarslingProfileInput: Codable {
    public let age: Int
    public let sex: String
    public let heightCm: Double
    public let weightKg: Double
    public let diabetesYn: String
    public let consentScope: String

    public init(age: Int, sex: String, heightCm: Double, weightKg: Double, diabetesYn: String = "unknown", consentScope: String = "demo") {
        self.age = age
        self.sex = sex
        self.heightCm = heightCm
        self.weightKg = weightKg
        self.diabetesYn = diabetesYn
        self.consentScope = consentScope
    }
}

public struct EarslingCandidateState: Codable {
    public let metric: String
    public let thermalBand: String?
    public let ambientThermalBand: String?
    public let heartRateBand: String?
    public let rhythmIrregularityBand: String?
    public let bloodPressureBand: String?
    public let candidateSource: String?

    public init(metric: String,
                thermalBand: String? = nil,
                ambientThermalBand: String? = nil,
                heartRateBand: String? = nil,
                rhythmIrregularityBand: String? = nil,
                bloodPressureBand: String? = nil,
                candidateSource: String? = "sdk_adapter") {
        self.metric = metric
        self.thermalBand = thermalBand
        self.ambientThermalBand = ambientThermalBand
        self.heartRateBand = heartRateBand
        self.rhythmIrregularityBand = rhythmIrregularityBand
        self.bloodPressureBand = bloodPressureBand
        self.candidateSource = candidateSource
    }
}

public struct EarslingContextState: Codable {
    public let contactQuality: String
    public let frameStable: Bool
    public let baselineReady: Bool
    public let motionNoise: String
    public let adapterIntegrity: String
    public let sourceIntegrity: String
}

public struct EarslingEvaluateRequest: Codable {
    public let profile: EarslingProfileInput
    public let candidateState: EarslingCandidateState
    public let contextState: EarslingContextState
    public let persistEvidence: Bool?
}

public struct EarslingTriggeredRule: Codable {
    public let id: String
    public let group: String
    public let result: String
    public let severity: String
    public let reason: String
}

public struct EarslingUiDirectives: Codable {
    public let graphColor: String
    public let crossBoundary: String
    public let earslingTipGlow: String
    public let haptic: String
    public let messageTone: String
}

public struct EarslingAndroidDirective: Codable {
    public let hapticPattern: String
    public let displayMessage: String
}

public struct EarslingIosDirective: Codable {
    public let feedback: String
    public let displayMessage: String
}

public struct EarslingAdapterPayload: Codable {
    public let metric: String
    public let status: String
    public let severity: String
    public let message: String
    public let uiColor: String
    public let hapticPattern: String
    public let graphDirective: String
    public let evidencePacketId: String?
    public let policyVersion: String
    public let timestamp: String
    public let android: EarslingAndroidDirective
    public let ios: EarslingIosDirective
}

public struct EarslingEvaluationResponse: Codable {
    public let ok: Bool
    public let engine: String
    public let engineVersion: String
    public let policyVersion: String
    public let ruleGraphVersion: String
    public let metric: String
    public let decision: String
    public let message: String
    public let triggeredRules: [EarslingTriggeredRule]
    public let uiDirectives: EarslingUiDirectives
    public let adapterPayload: EarslingAdapterPayload
    public let evidencePacketId: String?
    public let auditReceipt: String?
    public let disclaimers: [String]
    public let nonClaims: [String]
}

/// iOS UI handling rule:
/// OUT_OF_RANGE and NON_VALUE style responses are normal safety responses, not SDK failures.
/// Feedback must be throttled and must not be repeated as medical-alarm behavior.
