#!/bin/sh -eu
# flipbit - Toggle (flips) bit on file for owner only

if [ "${#}" -ne 2 ]; then
    echo "Usage: ${0} [rwx] file"
    exit 1
fi

mode="${1}"
file="${2}"

if [ ! -e "${file}" ]; then
    echo "File not found"
    exit 1
fi

# Get current permissions in octal format (3 digits: owner, group, other)
perms=$(stat -c "%a" "${file}")

# Extract owner permissions (first digit)
owner_perm=$(echo "${perms}" | cut -c1)

# Convert to decimal for bit manipulation
owner_dec=$((owner_perm))

# Toggle bits for owner only
for char in $(echo "${mode}" | sed 's/./& /g'); do
    case ${char} in
        r) owner_dec=$((owner_dec ^ 4)) ;;
        w) owner_dec=$((owner_dec ^ 2)) ;;
        x) owner_dec=$((owner_dec ^ 1)) ;;
    esac
done

# Keep group and other permissions unchanged
group_perm=$(echo "${perms}" | cut -c2)
other_perm=$(echo "${perms}" | cut -c3)

# Construct new permissions
new_perms="${owner_dec}${group_perm}${other_perm}"

chmod "${new_perms}" "${file}"
