#!/bin/bash

get_path_fork_level() {
    # Desc: Get fork level from two paths
    # Input:  arg1    str  path
    #         arg2    str  path
    # Output: stdout  int  fork level
    # Version: 0.0.1
    local path1="$1";
    local path2="$2";

    # Squeeze multiple slashes and remove trailing slashes
    path1="$(echo "$path1" | tr -s '/' | sed 's:/*$::' )";
    path2="$(echo "$path2" | tr -s '/' | sed 's:/*$::' )";
    
    # Check for mixed absolute/relative paths
    if [[ "$path1" =~ ^/ ]] && [[ "$path2" =~ ^/ ]]; then
        flag_root=true;
        # Remove initial /
        path1="$(echo "$path1" | sed -e 's:^/::' )";
        path2="$(echo "$path2" | sed -e 's:^/::' )";
    elif [[ ! "$path1" =~ ^/ ]] && [[ ! "$path2" =~ ^/ ]]; then
        flag_root=false;
    else
        declare -p path1 path2 flag_root;
        echo "FATAL:Mixed relative and absolute paths not supported." 1>&2;
        return 1;
    fi;

    # Save path as arrays with `/` as element delimiter
    local IFS='/';
    read -ra parts1 <<< "$path1";
    read -ra parts2 <<< "$path2";

    # Get fork level by counting identical path elements from rootside
    local fork_level=0;
    for (( i=0; i<${#parts1[@]} && i<${#parts2[@]}; i++ )); do
        if [[ "${parts1[i]}" != "${parts2[i]}" ]]; then break; fi;
        ((fork_level++));
    done;
    
    echo "$fork_level";
    #declare -p path1 path2 flag_root parts1 parts2 fork_level; # debug
    return 0;
}; # Get fork level int from two paths

printf "========Test 1========\n";  # fork at 0
p1="foo"; p2="bee"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 2========\n";  # fork at 1
p1="foo"; p2="foo/bar"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 3========\n";  # fork at 1
p1="foo"; p2="foo/bar/"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 4========\n";  # fork at 2
p1="foo/bar/baz"; p2="foo/bar"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 5========\n";  # fork at 2
p1="/foo/bar/baz"; p2="/foo/bar"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 6========\n";  # ERROR: No mixed
p1="foo/bar/baz"; p2="/bee/boo/tax"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 7========\n";  # fork at 0
p1="/foo/bar/baz"; p2="/bee/boo/tax"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 8========\n";  # # ERROR: No mixed
p1="/foo/bar/baz"; p2="foo"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";
printf "========Test 9========\n";  # fork at 3
p1="foo///////////bar////////baz//////"; p2="foo/////////bar/////////baz///bee"; declare -p p1 p2;
get_path_fork_level "$p1" "$p2";