<%
' Cached Zabbix API wrapper with background refresh
' Include the base zabbix.asp functions
%>
<!--#include file="./zabbix.asp"-->
<%

' Main cached function - returns data immediately, refreshes in background if stale
Function GetPrinterDataCached(hostIP)
    Dim cacheKey, cacheAge, forceRefresh
    cacheKey = "zabbix_" & hostIP

    ' Check if manual refresh was requested
    forceRefresh = (Request.QueryString("refresh") = "1" And Request.QueryString("ip") = hostIP)

    If forceRefresh Then
        ' Clear cache for manual refresh
        Application.Lock
        Application(cacheKey) = Empty
        Application(cacheKey & "_time") = Empty
        Application(cacheKey & "_refreshing") = "false"
        Application.Unlock
    End If

    ' Check if cache exists
    If Not IsEmpty(Application(cacheKey)) And Not forceRefresh Then
        cacheAge = DateDiff("n", Application(cacheKey & "_time"), Now())

        ' If cache is stale (>5 min) AND not already refreshing, trigger background update
        If cacheAge >= 5 And Application(cacheKey & "_refreshing") <> "true" Then
            ' Mark as refreshing
            Application.Lock
            Application(cacheKey & "_refreshing") = "true"
            Application.Unlock

            ' Trigger async background refresh (non-blocking)
            On Error Resume Next
            Dim http
            Set http = Server.CreateObject("MSXML2.ServerXMLHTTP.6.0")
            ' True = async (doesn't block user)
            http.Open "GET", "http://localhost/refreshzabbixcache.asp?ip=" & Server.URLEncode(hostIP), True
            http.Send
            Set http = Nothing
            On Error Goto 0
        End If

        ' Return cached data immediately (user doesn't wait)
        GetPrinterDataCached = Application(cacheKey)
        Exit Function
    End If

    ' No cache exists - fetch initial data (first time only, or after manual refresh)
    Dim freshData, zabbixConnected, pingStatus, tonerJSON

    zabbixConnected = ZabbixLogin()

    If zabbixConnected = "1" Then
        pingStatus = GetPrinterPingStatus(hostIP)
        tonerJSON = GetPrinterTonerLevels(hostIP)
    Else
        pingStatus = "-1"
        tonerJSON = ""
    End If

    ' Store as array: [connected, pingStatus, tonerJSON]
    Dim resultData(2)
    resultData(0) = zabbixConnected
    resultData(1) = pingStatus
    resultData(2) = tonerJSON

    ' Cache the result
    Application.Lock
    Application(cacheKey) = resultData
    Application(cacheKey & "_time") = Now()
    Application(cacheKey & "_refreshing") = "false"
    Application.Unlock

    GetPrinterDataCached = resultData
End Function

' Helper function to get cache age (for display purposes)
Function GetCacheAge(hostIP)
    Dim cacheKey, cacheTime
    cacheKey = "zabbix_" & hostIP

    If IsEmpty(Application(cacheKey & "_time")) Then
        GetCacheAge = -1
        Exit Function
    End If

    GetCacheAge = DateDiff("s", Application(cacheKey & "_time"), Now())
End Function

' Clear cache for a specific printer (called by manual refresh)
Sub ClearPrinterCache(hostIP)
    Dim cacheKey
    cacheKey = "zabbix_" & hostIP

    Application.Lock
    Application(cacheKey) = Empty
    Application(cacheKey & "_time") = Empty
    Application(cacheKey & "_refreshing") = "false"
    Application.Unlock
End Sub

' Clear all Zabbix cache (admin function)
Sub ClearAllZabbixCache()
    Dim key, keysToRemove(), count, i
    count = 0

    ' First pass: collect keys to remove
    ReDim keysToRemove(100) ' Initial size
    For Each key In Application.Contents
        If Left(key, 7) = "zabbix_" Then
            keysToRemove(count) = key
            count = count + 1
            If count Mod 100 = 0 Then
                ReDim Preserve keysToRemove(count + 100)
            End If
        End If
    Next

    ' Second pass: remove collected keys
    Application.Lock
    For i = 0 To count - 1
        Application.Contents.Remove(keysToRemove(i))
    Next
    Application.Unlock
End Sub
%>
