import Foundation

public enum CaptureRecordingState: Equatable {
    
    public static func == (lhs: Self, rhs: Self) -> Bool {
        switch lhs {
        case .needsSetup:
            guard case .needsSetup = rhs else { return false }
            return true
        case .readyToRecord:
            guard case .readyToRecord = rhs else { return false }
            return true
        case .isFlaggedForPhotoCaptureOnNextDraw:
            guard case .isFlaggedForPhotoCaptureOnNextDraw = rhs else { return false }
            return true
        case .isRecording:
            guard case .isRecording = rhs else { return false }
            return true
        case .isFlaggedToCompleteRecordingOnNextDraw:
            guard case .isFlaggedToCompleteRecordingOnNextDraw = rhs else { return false }
            return true
        case .isEndingRecording:
            guard case .isEndingRecording = rhs else { return false }
            return true
        case .completed:
            guard case .completed = rhs else { return false }
            return true
        }
    }
    
    public func isValueEqual(_ other: Self) -> Bool {
        switch self {
        case .needsSetup,
            .readyToRecord,
            .isFlaggedForPhotoCaptureOnNextDraw,
            .isFlaggedToCompleteRecordingOnNextDraw,
            .isEndingRecording,
            .completed:
            return self == other
        case .isRecording(let selfElapsedTime, let selfFrameIndex):
            guard case .isRecording(let otherElapsedTime, let otherFrameIndex) = other else { return false }
            return selfElapsedTime == otherElapsedTime && selfFrameIndex == otherFrameIndex
        }
    }
    
    case needsSetup
    case readyToRecord
    
    case isFlaggedForPhotoCaptureOnNextDraw
    
    case isRecording(_ elapsedTime: TimeInterval, frameIndex: Int)
    case isFlaggedToCompleteRecordingOnNextDraw
    case isEndingRecording
    
    case completed
}
