#!/bin/bash

# Function to get size of file or block device
get_size() {
  if [ -b "$1" ]; then  # Check if input is a block device
    size=$(sudo blockdev --getsize64 "$1")
  else  # Assume input is a file
    size=$(stat --format="%s" "$1")
  fi
  echo $size
}

# Check if at least two arguments are provided
if [ $# -lt 2 ]; then
  echo "Usage: $0 <source> <target> [test count]"
  exit 1
fi

source="$1"
target="$2"
count="${3:-100}"  # Default to 100 tests if not specified

# Ensure the source and target exist
if [ ! -e "$source" ] || [ ! -e "$target" ]; then
  echo "Error: Source or target does not exist."
  exit 1
fi

size=$(get_size "$source")  # Get size in bytes
if [ $? -ne 0 ] || [ -z "$size" ] || [ "$size" -eq 0 ]; then
  echo "Error: Failed to get size of the source."
  exit 1
fi

interval=$((size / count))

for ((i=0; i<count; i++)); do
  offset=$((i * interval))
  percent=$((i * 100 / count))
  # Use printf to overwrite the current line with the offset and percentage
  printf "\r%$(tput cols)s\rComparing at offset $offset... (${percent}%%)"
  if ! cmp --bytes=1M "$source" "$target" --ignore-initial=$offset > /dev/null 2>&1; then
    echo -e "\nMismatch or error at offset $offset"
    exit 1  # Exit after the first mismatch
  fi
done

# Clear the line after the loop finishes successfully and print success message
printf "\r%$(tput cols)s\r"
echo "No mismatches found."
