Imports System.Text

Public Class ServiceGroupManager
    ''' <summary>历史通讯数据服务集合</summary>
    Private _groupService As Dictionary(Of Integer, OtherService)

    Sub New()
        _groupService = New Dictionary(Of Integer, OtherService)
    End Sub

    ''' <summary>
    ''' 添加网上邻居，已存在则更新存活时间与状态
    ''' </summary>
    ''' <param name="other"></param>
    Public Sub Add(other As OtherService)
        If _groupService.ContainsKey(other.ServiceIndex) Then
            _groupService(other.ServiceIndex).LastTime = Now
            _groupService(other.ServiceIndex).IsAlive = True
        Else
            _groupService.Add(other.ServiceIndex, other)
        End If
    End Sub

    ''' <summary>
    ''' 校验其他服务的当前发送包索引是否与上一包索引重复，相同返回True，不相同返回False
    ''' </summary>
    ''' <returns></returns>
    Public Function CheckServiceSendIndex(serviceId As Integer, sendId As Integer) As Boolean
        If _groupService.ContainsKey(serviceId) Then
            If _groupService(serviceId).LastPacketIndex = sendId Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function


    ''' <summary>
    ''' 校验服务是否存活
    ''' </summary>
    Public Sub CheckAliveService()
        For Each other As KeyValuePair(Of Integer, OtherService) In _groupService
            If (Now - other.Value.LastTime).TotalSeconds > 30 Then
                other.Value.IsAlive = False
            End If
        Next
    End Sub


    ''' <summary>
    ''' 获取存活状态的所有网上邻居的索引字符串，以逗号分割
    ''' </summary>
    ''' <returns></returns>
    Public Function GetAliveServiceIndexString() As String
        '排序后输出
        Dim sb As New StringBuilder
        Dim bt() As Integer = _groupService.Keys.ToArray()
        Array.Sort(bt)
        For i As Integer = 0 To bt.Length - 1
            If _groupService(bt(i)).IsAlive = False Then Continue For
            If sb.Length = 0 Then
                sb.Append(bt(i))
            Else
                sb.Append("," & bt(i))
            End If
        Next

        Return sb.ToString


        '原来的顺序输出
        'For Each other As KeyValuePair(Of Integer, OtherService) In _groupService
        '    If other.Value.IsAlive = False Then Continue For
        '    If sb.Length = 0 Then
        '        sb.Append(other.Key)
        '    Else
        '        sb.Append("," & other.Key)
        '    End If
        'Next
    End Function
End Class


Public Class OtherService
    Sub New(index As Integer, packetIndex As Integer)
        ServiceIndex = index
        LastPacketIndex = packetIndex
        LastTime = Now
        IsAlive = True
    End Sub

    ''' <summary>
    ''' 最后通讯时间
    ''' </summary>
    Public Property LastTime As DateTime

    ''' <summary>
    ''' 最后通讯包ID
    ''' </summary>
    Public Property LastPacketIndex As Integer

    ''' <summary>
    ''' 服务索引
    ''' </summary>
    Public Property ServiceIndex As Integer

    ''' <summary>
    ''' 是否判定为在线
    ''' </summary>
    Public Property IsAlive As Boolean


End Class