// SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
// SPDX-License-Identifier: MIT

package ice

import (
	
	
)

// GetCandidatePairsStats returns a list of candidate pair stats.
func ( *Agent) () []CandidatePairStats {
	var  []CandidatePairStats
	 := .loop.Run(.loop, func( context.Context) {
		 := make([]CandidatePairStats, 0, len(.checklist))
		for ,  := range .checklist {
			 := CandidatePairStats{
				Timestamp:         time.Now(),
				LocalCandidateID:  .Local.ID(),
				RemoteCandidateID: .Remote.ID(),
				State:             .state,
				Nominated:         .nominated,
				// PacketsSent uint32
				// PacketsReceived uint32
				// BytesSent uint64
				// BytesReceived uint64
				// LastPacketSentTimestamp time.Time
				// LastPacketReceivedTimestamp time.Time
				FirstRequestTimestamp:         .FirstRequestSentAt(),
				LastRequestTimestamp:          .LastRequestSentAt(),
				FirstResponseTimestamp:        .FirstReponseReceivedAt(),
				LastResponseTimestamp:         .LastResponseReceivedAt(),
				FirstRequestReceivedTimestamp: .FirstRequestReceivedAt(),
				LastRequestReceivedTimestamp:  .LastRequestReceivedAt(),

				TotalRoundTripTime:   .TotalRoundTripTime(),
				CurrentRoundTripTime: .CurrentRoundTripTime(),
				// AvailableOutgoingBitrate float64
				// AvailableIncomingBitrate float64
				// CircuitBreakerTriggerCount uint32
				RequestsReceived:  .RequestsReceived(),
				RequestsSent:      .RequestsSent(),
				ResponsesReceived: .ResponsesReceived(),
				ResponsesSent:     .ResponsesSent(),
				// RetransmissionsReceived uint64
				// RetransmissionsSent uint64
				// ConsentRequestsSent uint64
				// ConsentExpiredTimestamp time.Time
			}
			 = append(, )
		}
		 = 
	})
	if  != nil {
		.log.Errorf("Failed to get candidate pairs stats: %v", )

		return []CandidatePairStats{}
	}

	return 
}

// GetSelectedCandidatePairStats returns a candidate pair stats for selected candidate pair.
// Returns false if there is no selected pair.
func ( *Agent) () (CandidatePairStats, bool) {
	 := false
	var  CandidatePairStats
	 := .loop.Run(.loop, func( context.Context) {
		 := .getSelectedPair()
		if  == nil {
			return
		}

		 = true
		 = CandidatePairStats{
			Timestamp:         time.Now(),
			LocalCandidateID:  .Local.ID(),
			RemoteCandidateID: .Remote.ID(),
			State:             .state,
			Nominated:         .nominated,
			// PacketsSent uint32
			// PacketsReceived uint32
			// BytesSent uint64
			// BytesReceived uint64
			// LastPacketSentTimestamp time.Time
			// LastPacketReceivedTimestamp time.Time
			// FirstRequestTimestamp time.Time
			// LastRequestTimestamp time.Time
			// LastResponseTimestamp time.Time
			TotalRoundTripTime:   .TotalRoundTripTime(),
			CurrentRoundTripTime: .CurrentRoundTripTime(),
			// AvailableOutgoingBitrate float64
			// AvailableIncomingBitrate float64
			// CircuitBreakerTriggerCount uint32
			// RequestsReceived uint64
			// RequestsSent uint64
			ResponsesReceived: .ResponsesReceived(),
			// ResponsesSent uint64
			// RetransmissionsReceived uint64
			// RetransmissionsSent uint64
			// ConsentRequestsSent uint64
			// ConsentExpiredTimestamp time.Time
		}
	})
	if  != nil {
		.log.Errorf("Failed to get selected candidate pair stats: %v", )

		return CandidatePairStats{}, false
	}

	return , 
}

// GetLocalCandidatesStats returns a list of local candidates stats.
func ( *Agent) () []CandidateStats {
	var  []CandidateStats
	 := .loop.Run(.loop, func( context.Context) {
		 := make([]CandidateStats, 0, len(.localCandidates))
		for ,  := range .localCandidates {
			for ,  := range  {
				 := ""
				if .Type() == CandidateTypeRelay {
					if ,  := .(*CandidateRelay);  {
						 = .RelayProtocol()
					}
				}
				 := CandidateStats{
					Timestamp:     time.Now(),
					ID:            .ID(),
					NetworkType:   ,
					IP:            .Address(),
					Port:          .Port(),
					CandidateType: .Type(),
					Priority:      .Priority(),
					// URL string
					RelayProtocol: ,
					// Deleted bool
				}
				 = append(, )
			}
		}
		 = 
	})
	if  != nil {
		.log.Errorf("Failed to get candidate pair stats: %v", )

		return []CandidateStats{}
	}

	return 
}

// GetRemoteCandidatesStats returns a list of remote candidates stats.
func ( *Agent) () []CandidateStats {
	var  []CandidateStats
	 := .loop.Run(.loop, func( context.Context) {
		 := make([]CandidateStats, 0, len(.remoteCandidates))
		for ,  := range .remoteCandidates {
			for ,  := range  {
				 := CandidateStats{
					Timestamp:     time.Now(),
					ID:            .ID(),
					NetworkType:   ,
					IP:            .Address(),
					Port:          .Port(),
					CandidateType: .Type(),
					Priority:      .Priority(),
					// URL string
					RelayProtocol: "",
				}
				 = append(, )
			}
		}
		 = 
	})
	if  != nil {
		.log.Errorf("Failed to get candidate pair stats: %v", )

		return []CandidateStats{}
	}

	return 
}