#!/usr/bin/env bash

set -euo pipefail

# Constants
CREDS_DIR="$HOME/dotfiles/creds/data"
BITLOCKER_PWD_FILE="$CREDS_DIR/bitlocker_pwd"
MOUNT_BASE_DIR="/media"

# Functions
print_separator() {
    echo "--------------------------------------"
}

install_if_missing() {
    local package=$1
    if ! command -v "$package" &> /dev/null; then
        echo "⚠️ $package could not be found"
        echo "💡 Installing $package"
        sudo nala install -y "$package"
    fi
}

get_user_input() {
    local prompt=$1
    local default=$2
    local response

    read -p "$prompt (default: $default): " response
    echo "${response:-$default}"
}

get_bitlocker_password() {
    if [[ -f "$BITLOCKER_PWD_FILE" ]]; then
        echo "🔑 Bitlocker Password file detected at $BITLOCKER_PWD_FILE"
        cat "$BITLOCKER_PWD_FILE"
    else
        echo "🤔🔑 Password file does not exist"
        read -sp "Enter bitlocker password: " bitlocker_pwd
        echo
        mkdir -p "$(dirname "$BITLOCKER_PWD_FILE")"
        echo "$bitlocker_pwd" > "$BITLOCKER_PWD_FILE"
        chmod 600 "$BITLOCKER_PWD_FILE"
        echo "$bitlocker_pwd"
    fi
}

mount_bitlocker() {
    local device=$1
    local mnt_name=$2
    local bitlocker_pwd

    install_if_missing dislocker

    bitlocker_pwd=$(get_bitlocker_password)

    sudo mkdir -p "$MOUNT_BASE_DIR/${mnt_name}_bitlocker"
    sudo dislocker "/dev/$device" "-u$bitlocker_pwd" -- "$MOUNT_BASE_DIR/${mnt_name}_bitlocker"
    sudo mount -o loop,rw,uid=$(id -u),gid=$(id -g) "$MOUNT_BASE_DIR/${mnt_name}_bitlocker/dislocker-file" "$MOUNT_BASE_DIR/$mnt_name"
}

mount_regular() {
    local device=$1
    local mnt_name=$2

    sudo mount --source "/dev/$device" --target "$MOUNT_BASE_DIR/$mnt_name"
}

add_to_fstab() {
    local device=$1
    local mnt_name=$2

    local drive_uuid=$(sudo blkid -s UUID -o value "/dev/$device")
    local drive_type=$(lsblk -no FSTYPE "/dev/$device")
    local drive_mount_point="$MOUNT_BASE_DIR/$mnt_name"
    local drive_mount_options="defaults"
    local drive_dump="0"
    local drive_pass="0"

    if [[ "$drive_type" == "ntfs" ]]; then
        drive_mount_options="$drive_mount_options,ntfs-3g"
    fi

    local fstab_entry="UUID=$drive_uuid $drive_mount_point $drive_type $drive_mount_options $drive_dump $drive_pass"

    if grep -q "$drive_uuid" /etc/fstab; then
        sudo sed -i "s|.*$drive_uuid.*|$fstab_entry|" /etc/fstab
    else
        echo "$fstab_entry" | sudo tee -a /etc/fstab
    fi

    echo "🔧 Updated /etc/fstab with the new entry"
}

# Main script
echo "💾 Available devices:"
sudo fdisk -l
print_separator
lsblk
print_separator

device=$(get_user_input "Enter device name" "sdb1")
mnt_name=$(get_user_input "Enter mount name" "mymnt")

sudo mkdir -p "$MOUNT_BASE_DIR/$mnt_name"

if lsblk -no FSTYPE "/dev/$device" | grep -q "BitLocker"; then
    echo "🔒 Drive is BitLocker encrypted"
    mount_bitlocker "$device" "$mnt_name"
else
    echo "Drive is not encrypted"
    mount_regular "$device" "$mnt_name"
fi

if [[ $? -eq 0 ]]; then
    echo "✅ The drive has been successfully mounted at $MOUNT_BASE_DIR/$mnt_name"
    print_separator

    read -p "Do you want to add the drive to fstab? (y/N): " add_fstab
    if [[ "${add_fstab,,}" == "y" ]]; then
        add_to_fstab "$device" "$mnt_name"
    fi
else
    echo "❌ There was an error while mounting the drive. Please check your input and try again."
    exit 1
fi

echo "If Mount failed, try: sudo fuser -v /dev/"$device"; sudo kill piddd"
