package org.kne.cloud.network.monitor;

import org.kne.cloud.clock.HighAccuracyClock;
import org.kne.cloud.network.ipv6.PacketID;
import org.kne.math.Long128;

/**
 * 时间戳监控器接口
 * 提供高性能的数据包监控和流量统计功能
 */
public interface TimestampMonitor<K> {
    
    // ==================== 配置相关方法 ====================
    
    /**
     * 获取监控器名称
     */
    String getName();
    
    /**
     * 设置监控器名称
     */
    void setName(String name);
    
    /**
     * 获取时钟源
     */
    HighAccuracyClock getClock();
    
    // ==================== 数据记录方法 ====================
    
    /**
     * 记录数据包（使用当前时间）
     * @param key 数据包标识
     * @param length 数据包长度
     * @return 是否记录成功
     */
    boolean recordPacket(K key,int count, int length);
    
    /**
     * 记录数据包（使用指定时间戳）
     * @param key 数据包标识
     * @param timestamp 时间戳
     * @param length 数据包长度
     * @return 是否记录成功
     */
    boolean recordPacket(K key, Long128 timestamp,int count, int length);
    

    boolean recordPacket(K key, Long128 timestamp, int count,int length, long dsndDelay);

    boolean recordPacket(K key, int count,int length, long dsndDelay);
    
    // ==================== 清理维护方法 ====================
    
    /**
     * 执行清理操作（使用当前时间）
     */
    void cleanup();
    
    /**
     * 执行清理操作（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     */
    void cleanup(Long128 currentTime, long timeWindowNs);
    
    // ==================== 统计查询方法 ====================
    
    /**
     * 计算数据量（使用当前时间）
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 数据量（字节）
     */
    long calculateDataVolume(long timeWindowNs);
    
    /**
     * 计算数据量（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 数据量（字节）
     */
    long calculateDataVolume(Long128 currentTime, long timeWindowNs);
    
    /**
     * 计算数据包数量（使用当前时间）
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 数据包数量
     */
    long calculatePacketCount(long timeWindowNs);
    
    /**
     * 计算数据包数量（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 数据包数量
     */
    long calculatePacketCount(Long128 currentTime, long timeWindowNs);
    
    /**
     * 计算带宽（使用当前时间）
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 带宽（字节/秒）
     */
    long calculateBandwidth(long timeWindowNs);
    
    /**
     * 计算带宽（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 带宽（字节/秒）
     */
    long calculateBandwidth(Long128 currentTime, long timeWindowNs);
    
    /**
     * 计算转发率（使用当前时间）
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 转发率（包/秒）
     */
    long calculatePacketRate(long timeWindowNs);
    
    /**
     * 计算转发率（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 转发率（包/秒）
     */
    long calculatePacketRate(Long128 currentTime, long timeWindowNs);
    
    
    /**
     * 计算流量统计信息（使用当前时间）
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 流量统计信息
     */
    TrafficStats calculateTrafficStats(long timeWindowNs);
    
    /**
     * 计算流量统计信息（使用指定时间）
     * @param currentTime 当前时间
     * @param timeWindowNs 时间窗口（纳秒）
     * @return 流量统计信息
     */
    TrafficStats calculateTrafficStats(Long128 currentTime, long timeWindowNs);
    
    long getRecentDelay();
    

	TimestampMonitorValue getRecentDelayEntry();
    
    
    // ==================== 全局统计方法 ====================
    
    /**
     * 获取总数据量（从启动开始）
     * @return 总数据量（字节）
     */
    long getTotalDataSize();
    
    /**
     * 获取总数据包数量（从启动开始）
     * @return 总数据包数量
     */
    long getTotalPackets();
    
    /**
     * 获取当前条目数量
     * @return 条目数量
     */
    int getEntryCount();
    
    // ==================== 管理控制方法 ====================
    
    /**
     * 重置监控器（清空所有数据）
     */
    void reset();
    
    /**
     * 获取字符串表示
     * @return 监控器状态字符串
     */
    String toString();


}