/// 格式化时间
String formatDate(dynamic date, [String format = 'YYYY-MM-DD hh:mm:ss']) {
  DateTime dateTime;

  if (date is String) {
    // 如果是字符串类型，尝试将其解析为 DateTime
    dateTime = DateTime.tryParse(date) ?? DateTime.now();
  } else if (date is DateTime) {
    // 如果是 DateTime 类型，直接使用
    dateTime = date;
  } else {
    // 如果不是合法的输入类型，默认使用当前时间
    dateTime = DateTime.now();
  }

  final yyyy = dateTime.year.toString();
  final MM = (dateTime.month).toString().padLeft(2, '0');
  final dd = (dateTime.day).toString().padLeft(2, '0');
  final HH = (dateTime.hour).toString().padLeft(2, '0');
  final mm = (dateTime.minute).toString().padLeft(2, '0');
  final ss = (dateTime.second).toString().padLeft(2, '0');

  String result = format
      .replaceFirst(RegExp('YYYY'), '$yyyy')
      .replaceFirst(RegExp('MM'), MM)
      .replaceFirst(RegExp('DD'), dd)
      .replaceFirst(RegExp('hh'), HH)
      .replaceFirst(RegExp('mm'), mm)
      .replaceFirst(RegExp('ss'), ss);

  return result;
}

/// 将秒数格式化为 00:00 或 00:00:00
/// - [seconds]: 秒数
/// - [format]: 格式化字符串，默认为 "hh:mm:ss"
String formatSeconds(
  int seconds, [
  String format = 'hh:mm:ss',
]) {
  if (seconds < 0) seconds = 0;

  int h = seconds ~/ 3600;
  int m = (seconds % 3600) ~/ 60;
  int s = seconds % 60;

  String two(int n) => n.toString().padLeft(2, '0');

  // 支持以下 token：
  // hh = 补零小时, h = 不补零小时
  // mm = 补零分钟, m = 不补零分钟
  // ss = 补零秒,   s = 不补零秒
  final replacements = {
    'hh': two(h),
    'mm': two(m),
    'ss': two(s),
    'h': h.toString(),
    'm': m.toString(),
    's': s.toString(),
  };

  String result = format;

  replacements.forEach((key, value) {
    result = result.replaceAll(key, value);
  });

  return result;
}

/// 将 "HH", "HH:mm" 或 "HH:mm:ss" 转为当天 DateTime
DateTime parseTime(String timeStr) {
  final now = DateTime.now();
  final parts = timeStr.split(':').map(int.parse).toList();

  final hour = parts.length > 0 ? parts[0] : 0;
  final minute = parts.length > 1 ? parts[1] : 0;
  final second = parts.length > 2 ? parts[2] : 0;

  return DateTime(now.year, now.month, now.day, hour, minute, second);
}
