//
import Foundation
// Copyright (c) ZeroC, Inc. All rights reserved.
//
import Ice

class TimeoutI: Timeout {
    func op(current _: Current) throws {}

    func sendData(seq _: ByteSeq, current _: Current) throws {}

    func sleep(to: Int32, current _: Current) throws {
        Thread.sleep(forTimeInterval: TimeInterval(to) / 1000)
    }
}

class ControllerI: Controller {
    var _adapter: Ice.ObjectAdapter

    init(_ adapter: Ice.ObjectAdapter) {
        _adapter = adapter
    }

    func holdAdapter(to: Int32, current: Ice.Current) throws {
        _adapter.hold()
        if to >= 0 {
            let queue = try current.adapter!.getDispatchQueue()
            queue.async {
                self._adapter.waitForHold()
                queue.asyncAfter(deadline: .now() + .milliseconds(Int(to))) {
                    do {
                        try self._adapter.activate()
                    } catch {
                        preconditionFailure()
                    }
                }
            }
        }
    }

    func resumeAdapter(current _: Ice.Current) throws {
        try _adapter.activate()
    }

    func shutdown(current: Ice.Current) {
        current.adapter!.getCommunicator().shutdown()
    }
}
