{
  util-linux,
  cryptsetup,
  btrfs-progs,
  writeShellApplication,
}: let
  externalDriveData = import ../data/drives/raspberryExternalDrive.nix;
in (writeShellApplication {
  name = "mk-raspberry-ext-drive";
  runtimeInputs = [
    util-linux
    cryptsetup
    btrfs-progs
  ];
  text = ''
    if [ -z "''${1-}" ]; then
      echo "Please specify a path to device as first argument"
      exit 1
    fi

    DRIVE_PATH=$1

    if [ -z "''${2-}" ]; then
      echo "Please specify a key file to use"
      exit 1
    fi

    KEY_FILE=$2

    if [ -z "''${3-}" ]; then
      echo "Please specify a temp mountpoint to use"
      exit 1
    fi

    TEMP_MOUNTPOINT=$3

    if [ "$EUID" -ne 0 ]; then
      echo "Please run as root"
      exit
    fi
    echo "Wiping Partitions..."
    wipefs --all "$DRIVE_PATH"

    echo "Creating Encrypted Partition"
    cryptsetup luksFormat "$DRIVE_PATH" --key-file "$KEY_FILE" --label "${externalDriveData.encryptedLabel}"

    echo "Opening Encrypted Partition"
    cryptsetup open "$DRIVE_PATH" "mk-raspberry-ext-drive" --key-file "$KEY_FILE"

    echo "Formatting Encrypted Filesystem"
    mkfs.btrfs -L "${externalDriveData.unencryptedLabel}" /dev/mapper/mk-raspberry-ext-drive

    echo "Mounting Partition"
    mount -t btrfs /dev/mapper/mk-raspberry-ext-drive "$TEMP_MOUNTPOINT"

    echo "Creating Folders"
    mkdir "$TEMP_MOUNTPOINT/backups"
    mkdir "$TEMP_MOUNTPOINT/storage"
    mkdir "$TEMP_MOUNTPOINT/extras"

    echo "Unmounting"
    umount "$TEMP_MOUNTPOINT"

    echo "Closing mapper device"
    cryptsetup close "mk-raspberry-ext-drive"
  '';
})