#!/bin/bash
# 检查指定目录或者文件是否存在
# 导入函数方法：source check_existence.sh

check_file()
{
  local file_path="$1"
  local expected_md5="${2:-}"

  # 检查路径是否为空
  if [[ -z "$file_path" ]]; then
    echo "Error: File path is required." >&2
    return 1
  fi

  # 检查文件是否存在（-e 表示存在，-f 表示是普通文件或软链接指向普通文件）
  # 注意：[[ -f ]] 会自动 dereference 软链接，只要目标是普通文件就返回 true
  if [[ ! -f "$file_path" ]]; then
    echo "Error: File '$file_path' does not exist or is not a regular file." >&2
    return 1
  fi

  # 如果未提供 MD5，仅检查存在性即成功
  if [[ -z "$expected_md5" ]]; then
    return 0
  fi

  # 计算文件的实际 MD5（自动跟随软链接读取目标内容）
  local actual_md5
  if command -v md5sum > /dev/null 2>&1; then
    actual_md5=$(md5sum "$file_path" 2> /dev/null | cut -d' ' -f1)
  else
    echo "Error: No MD5 tool (md5sum or md5) found." >&2
    return 1
  fi

  # 检查是否成功读取 MD5
  if [[ -z "$actual_md5" ]]; then
    echo "Error: Failed to compute MD5 for '$file_path'." >&2
    return 1
  fi

  # 比较 MD5（转为小写以兼容大小写差异，虽然 md5sum 通常输出小写）
  if [[ "${actual_md5,,}" == "${expected_md5,,}" ]]; then
    return 0
  else
    echo "Error: MD5 mismatch for '$file_path'." >&2
    echo "  Expected: $expected_md5" >&2
    echo "  Actual  : $actual_md5" >&2
    return 1
  fi
}

check_dir()
{
  local dir="$1"
  local filter_expr="${2:-}"
  local expected_count="${3:-}"

  # 检查第一个参数是否提供
  if [[ -z "$dir" ]]; then
    echo "Error: Directory path is required." >&2
    return 1
  fi

  # 检查目录是否存在
  if [[ ! -d "$dir" ]]; then
    echo "Error: Directory '$dir' does not exist." >&2
    return 1
  fi

  # 如果未提供 filter_expr 或 expected_count，则跳过数量检查，仅确认目录存在
  if [[ -z "$filter_expr" ]] || [[ -z "$expected_count" ]]; then
    return 0
  fi

  # 构造并执行 ls 命令，统计匹配行数
  # 使用 LC_ALL=C 确保 ls 输出格式一致（避免 locale 影响）
  local actual_count
  actual_count=$(LC_ALL=C ls -lAgG "$dir" 2> /dev/null | grep -c "$filter_expr")

  if [[ "$actual_count" -eq "$expected_count" ]]; then
    return 0
  else
    echo "Mismatch in '$dir': expected $expected_count entries matching '$filter_expr', got $actual_count." >&2
    return 1
  fi
}
