import CodexBarCore import Foundation struct CodexWeeklyResetConfirmation: Sendable { enum InitialDecision: Equatable, Sendable { case publishInitial case requiresConfirmation case preservePrevious } enum ConfirmationDecision: Equatable, Sendable { case publishConfirmation case preservePrevious } private static let resetEquivalenceToleranceSeconds: TimeInterval = 2 * 60 private static let resetThreshold = 1.0 static func initialDecision( previous: UsageSnapshot?, initial: UsageSnapshot) -> InitialDecision { guard self.isFinite(initial.updatedAt) else { return .preservePrevious } guard let previous else { guard let initialWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: initial) else { return .publishInitial } return self.initialDecisionWithoutWeeklyBaseline( initialWeekly: initialWeekly, capturedAt: initial.updatedAt) } guard Self.isFinite(previous.updatedAt), initial.updatedAt > previous.updatedAt else { return .preservePrevious } guard let previousWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: previous) else { guard let initialWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: initial) else { return .publishInitial } return self.initialDecisionWithoutWeeklyBaseline( initialWeekly: initialWeekly, capturedAt: initial.updatedAt) } guard previousWeekly.usedPercent.isFinite else { return .preservePrevious } // A source can legitimately omit the weekly lane and rely on the existing // reset-window backfill path. Only gate an explicit weekly observation. guard let initialWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: initial) else { return .preservePrevious } guard initialWeekly.usedPercent.isFinite else { return .preservePrevious } let previousBoundary = Self.finiteResetBoundary(previousWeekly) let initialBoundary = Self.finiteResetBoundary(initialWeekly) if initialWeekly.resetsAt != nil, Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) == nil { return .preservePrevious } if let previousBoundary, let initialBoundary, initialBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds { return .preservePrevious } guard previousWeekly.usedPercent > Self.resetThreshold, initialWeekly.usedPercent <= Self.resetThreshold else { return .publishInitial } guard Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt) != nil else { return .preservePrevious } return .requiresConfirmation } static func confirmationDecision( previous: UsageSnapshot?, initial: UsageSnapshot, confirmation: UsageSnapshot) -> ConfirmationDecision { guard previous.map({ self.isFinite($0.updatedAt) }) ?? true, self.isFinite(initial.updatedAt), self.isFinite(confirmation.updatedAt), confirmation.updatedAt > initial.updatedAt, let initialWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: initial), let confirmationWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: confirmation), initialWeekly.usedPercent.isFinite, confirmationWeekly.usedPercent.isFinite else { return .preservePrevious } let previousWeekly = CodexConsumerProjection.sourceRateWindow( for: .weekly, snapshot: previous) guard previousWeekly?.usedPercent.isFinite ?? true else { return .preservePrevious } let previousBoundary = previousWeekly.flatMap(Self.finiteResetBoundary) let confirmationBoundary = Self.finiteResetBoundary(confirmationWeekly) if confirmationWeekly.resetsAt != nil, Self.validResetBoundary(confirmationWeekly, capturedAt: confirmation.updatedAt) == nil { return .preservePrevious } if let previousBoundary, let confirmationBoundary, confirmationBoundary.timeIntervalSince(previousBoundary) < -Self.resetEquivalenceToleranceSeconds { return .preservePrevious } if confirmationWeekly.usedPercent > Self.resetThreshold { return .publishConfirmation } guard initialWeekly.usedPercent <= Self.resetThreshold, let initialBoundary = Self.validResetBoundary(initialWeekly, capturedAt: initial.updatedAt), let confirmationBoundary = Self.validResetBoundary( confirmationWeekly, capturedAt: confirmation.updatedAt), abs(initialBoundary.timeIntervalSince(confirmationBoundary)) < Self.resetEquivalenceToleranceSeconds else { return .preservePrevious } if let previous, let previousWeekly, let previousBoundary = Self.validResetBoundary( previousWeekly, capturedAt: previous.updatedAt) { guard initialBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds, confirmationBoundary.timeIntervalSince(previousBoundary) >= Self.resetEquivalenceToleranceSeconds else { return .preservePrevious } } return .publishConfirmation } private static func initialDecisionWithoutWeeklyBaseline( initialWeekly: RateWindow, capturedAt: Date) -> InitialDecision { guard initialWeekly.usedPercent.isFinite else { return .preservePrevious } if initialWeekly.resetsAt != nil, self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil { return .preservePrevious } guard initialWeekly.usedPercent <= self.resetThreshold else { return .publishInitial } return self.validResetBoundary(initialWeekly, capturedAt: capturedAt) == nil ? .preservePrevious : .requiresConfirmation } private static func finiteResetBoundary(_ window: RateWindow) -> Date? { guard let boundary = window.resetsAt, isFinite(boundary) else { return nil } return boundary } private static func validResetBoundary(_ window: RateWindow, capturedAt: Date) -> Date? { guard let boundary = self.finiteResetBoundary(window), boundary > capturedAt else { return nil } return boundary } private static func isFinite(_ date: Date) -> Bool { date.timeIntervalSinceReferenceDate.isFinite } }