import Foundation

func exponentialBackoff(
    maxRetries: Int,
    initialDelay: TimeInterval,
    queue: DispatchQueue? = nil,
    task: @escaping (_ completion: @escaping (Bool) -> Void) -> Void,
    failure: @escaping () -> Void
) {
    var retries = 0
    var delay = initialDelay
    
    func executeTask() {
        task { success in
            if success {
                print("CSLIB ℹ️ Info: Exponential backoff task succeeded.")
            } else {
                retries += 1
                if retries > maxRetries {
                    print("Exponential backoff task failed after \(maxRetries) retries.")
                    failure()
                } else {
                    delay *= 2 // Double the delay for exponential backoff
                    
                    if let queue = queue {
                        queue.async {
                            Thread.sleep(forTimeInterval: delay)
                            attempt() // Retry after delay in the given queue
                        }
                    } else {
                        DispatchQueue.global().asyncAfter(deadline: .now() + delay) {
                            attempt() // Retry after delay in global queue
                        }
                    }
                }
            }
        }
    }
    
    func attempt() {
        if let queue = queue {
            queue.async {
                executeTask()
            }
        } else {
            executeTask()
        }
    }
    
    attempt()
}
