autoload -Uz log_debug log_error log_info log_status log_group log_output log_warning

local -r _usage="Usage: %B${0}%b <source> <volume name> <output_name>

Create macOS disk image <volume name> <output_name> with contents of <source>"

if (( ! # )) {
  log_error 'Called without arguments.'
  log_output ${_usage}
  return 2
}

local source=${1}
local volume_name=${2}
local output_name=${3}

log_group "Create macOS disk image"

local _hdiutil_flags
if (( _loglevel < 1 )) _hdiutil_flags='-quiet'

trap "hdiutil detach ${_hdiutil_flags} /Volumes/${output_name}; rm temp.dmg; log_group; return 2" ERR

hdiutil create ${_hdiutil_flags} \
    -volname "${volume_name}" \
    -srcfolder ${source} \
    -ov \
    -fs APFS \
    -format UDRW \
    temp.dmg
hdiutil attach ${_hdiutil_flags} \
    -noverify \
    -readwrite \
    -mountpoint /Volumes/${output_name} \
    temp.dmg

log_info "Waiting 2 seconds to ensure mounted volume is available..."
sleep 2
log_status "Done"
log_info "Setting up disk volume..."
log_status "Volume icon"
SetFile -c icnC /Volumes/${output_name}/.VolumeIcon.icns
log_status "Icon positions"
osascript package.applescript ${output_name}
log_status "File permissions"
chmod -Rf go-w /Volumes/${output_name}
SetFile -a C /Volumes/${output_name}
rm -rf -- /Volumes/${output_name}/.fseventsd(N)
log_info "Converting disk image..."

if (( ${+CI} )) {
    local _status=0
    for i ({1..5}) {
        hdiutil detach ${_hdiutil_flags} /Volumes/${output_name} && _status=0 || _status=1

        if (( status )) {
            log_warning "Unable to eject disk image (attempt #${i}). Retrying."
        } else {
            break
        }
    }

    if (( status )) {
        log_error "Unable to eject disk image after 5 attempts. Aborting"
        log_group
        return 2
    }
} else {
    hdiutil detach ${_hdiutil_flags} /Volumes/${output_name}
}

hdiutil convert ${_hdiutil_flags} \
    -format ULMO \
    -ov \
    -o ${output_name}.dmg temp.dmg

rm temp.dmg

trap '' ERR

log_group

return 0
