#!/bin/bash
# shellcheck disable=SC2155
if ! type "include" > /dev/null 2>&1; then
  include() {
  . "$(cd "$(dirname "$1")" && pwd)/${2}";
  };
fi
include "${BASH_SOURCE[0]}" ../pragma_once.bash
if ! pragma_once ${BASH_SOURCE[0]}; then return 0; fi
include "${BASH_SOURCE[0]}" ./global_rely/export.bash
# shellcheck source=./global_rely/export.bash



get_relative_path_ex() {
  local abs_path=${1%/}
  local abs_rely_path=${2%/}
  local base=$3
  local abs_path_array
  local abs_rely_path_array
  if [[ "$abs_path" == "$abs_rely_path" ]]; then
    if [[ -n "$base" ]]; then
      _ret_="${base}"
    else
      _ret_="./"
    fi
    return 0
  fi
  IFS='/' read -r -a abs_path_array <<<"$abs_path"
  IFS='/' read -r -a abs_rely_path_array <<<"$abs_rely_path"
  local abs_path_length=${#abs_path_array[@]}
  local abs_rely_path_length=${#abs_rely_path_array[@]}
  local i=0
  while [[ "${abs_path_array[i]}" == "${abs_rely_path_array[i]}" ]]; do
    ((i++))
  done
  local result=""
  for ((j = i; j < abs_path_length; j++)); do
    result="../$result"
  done
  if [[ -n "$base" ]]; then
    result="${base}/$result"
  fi
  for ((j = i; j < abs_rely_path_length; j++)); do
    result+="${abs_rely_path_array[j]}/"
  done
  _ret_="${result%/}"
}
get_relative_origin_path() {
  get_relative_path_ex $1 $2 "\$ORIGIN"
}

get_relative_path() {
  get_relative_path_ex $1 $2 ""
}



test_get_relative_path() {
  # Array of test cases with each element containing:
  # 1. Function name to call (either "get_relative_path" or "get_relative_path_ex")
  # 2. First path argument
  # 3. Second path argument
  # 4. Base argument (for get_relative_path_ex, otherwise empty)
  # 5. Expected result
  local test_cases=(
    # Format: "function_name path1 path2 base expected"
    "get_relative_origin_path /home/user/project/folder /home/user/project/folder \$ORIGIN"
    "get_relative_origin_path /home/user/project/folder /home/user/project \$ORIGIN/.."
    "get_relative_origin_path /home/user/project/folder /home/user/tt/aa \$ORIGIN/../../tt/aa"
    "get_relative_origin_path /home/user/project/folder/subfolder /home/user/project/another_folder \$ORIGIN/../../another_folder"
    "get_relative_origin_path /var/www/html /home/user/tt/aa \$ORIGIN/../../../home/user/tt/aa"

    # Test cases with an empty base for get_relative_path_ex
    "get_relative_path /home/user/project/folder /home/user/project/folder  ./"
    "get_relative_path /home/user/project/folder /home/user/project .."
    "get_relative_path /home/user/project/folder /home/user/tt/aa ../../tt/aa"
    "get_relative_path /home/user/project/folder/subfolder /home/user/project/another_folder ../../another_folder"
    "get_relative_path /var/www/html /home/user/tt/aa ../../../home/user/tt/aa"
  )

  # Loop through each test case
  for test_case in "${test_cases[@]}"; do
    # Read the elements of the test case into variables
    local function_name path1 path2 expected
    IFS=" " read -r function_name path1 path2 expected <<<"$test_case"
    # Call the appropriate function based on the test case
    if [[ "$function_name" == "get_relative_origin_path" ]]; then
      get_relative_origin_path "$path1" "$path2"
    elif [[ "$function_name" == "get_relative_path" ]]; then
      get_relative_path "$path1" "$path2"
    fi
    # Check the result
    if [[ "$_ret_" != "$expected" ]]; then
      echo "$function_name Test Failed:"
      echo "  Input: $path1, $path2"
      echo "  Expected: '$expected', but got '$_ret_'"
    else
      echo "$function_name Test Passed."
    fi
  done
}

return 0