import 'dart:async';
import 'package:fis_common/logger/logger.dart';
import 'package:flutter/foundation.dart';

/// 心跳
abstract class Heartbeat {
  Heartbeat(this.interval);

  Timer? _timer;
  int _sentCount = 0;

  /// 间隔（ms）
  final int interval;

  /// 已发送心跳次数
  int get sentCount => _sentCount;

  /// 是否正在运行
  bool get isRunning => _timer != null && _timer!.isActive;

  /// 开始
  void start() {
    if (isRunning) return;

    ///由于Server目前配置的心跳时间是5分钟，时长过长，5分钟之内刷新有可能导致Server认为当前用户离线，所以这里开始时就发一次心跳
    sendOnce();
    final minDuration = Duration(milliseconds: 10000); // 最小间隔时长
    Duration duration = Duration(milliseconds: interval);
    if (duration < minDuration) {
      logger.i("心跳间隔时长过短，已自动调整为$minDuration");
      duration = minDuration;
    }
    logger.i("心跳开始，间隔时长：$interval");
    _timer = Timer.periodic(
      duration,
      (timer) {
        sendOnce();
        _sentCount++;
      },
    );
  }

  /// 停止
  void stop() {
    logger.i("心跳终止");
    _timer?.cancel();
    _timer = null;
  }

  /// 发送一次心跳
  @protected
  void sendOnce();
}
