/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights resvered.
 */

/**
 * @file
 * The file declars the PushableTimeout class.
 */

package io4cj

class PushableTimeout <: Timeout {

    private var ptime: Timeout = Timeout()
    private var phasDeadline: Bool = true
    private var pdeadlineNanoTime: Int64 = 0
    private var ptimeoutNanos: Int64 = 0

    public init(){

    }
    
    @Frozen
    func push(ptime: Timeout) {
        this.ptime = ptime
        this.phasDeadline = ptime.hasDeadline()
        try{
        this.pdeadlineNanoTime = ptime.deadlineNanoTime()
        }catch(e: Exception){

        }
        this.ptimeoutNanos = ptime.timeoutNanos()
        if (pdeadlineNanoTime != ptimeoutNanos) {
            pdeadlineNanoTime = -1
        }
        ptime.timeout(minTimeout(ptimeoutNanos , timeoutNanos()))

        if (phasDeadline && hasDeadline()) {
            ptime.deadlineNanoTime(min(deadlineNanoTime(), pdeadlineNanoTime))
        } else if (hasDeadline()) {
            ptime.deadlineNanoTime(deadlineNanoTime())
        }
    }

    @Frozen
    func pop() {
        ptime.timeout(ptimeoutNanos)
        if (phasDeadline) {
            ptime.deadlineNanoTime(pdeadlineNanoTime)
        } else {
            ptime.clearDeadline()
        }
    }
}