#!/usr/bin/bash

# source bash base library
# shellcheck disable=SC1091
source /usr/libexec/bash-base.bash || {
   echo "$0: fatal error: failed to source /usr/libexec/bash-base.bash" >&2
   exit 1
}

bb_require_libs bash-ini ldapusermgmt/common

# shellcheck disable=SC2120,SC2034
function local_usage() {
    usage "${1-1}" "${2-}" "<user-cn> [..]" "-" <<EOF
  Removes on or more users specified on command line or read from pipe not
  connected to a terminal.
EOF
}

# config_read_userdel <section>
function config_read_userdel() {
    (( $# == 1 )) || \
        bb_fatal "config_read_userdel: called with $# instead of 1 arg"

    local _section="$1"

    [ -z "$_section" ] || {
        config_section_exists "$_section" || \
            bb_quit 1 "no such config section: $_section"

        config_read_optional POST_DELETE_USER_HOOK "post delete user hook" \
            "$_section"
        config_read_optional POST_DELETE_USERS_HOOK "post delete users hook" \
            "$_section"
    }
}

# delete_user <user-cn>
# shellcheck disable=SC2034
function delete_user() {
    (( $# == 1 )) || bb_fatal "delete_user called with $# instead of 1 arg"

    local _user_cn="$1"
    local -a delete_user__dns=()

    if ldap_resolv_user_dns delete_user__dns "$_user_cn"
    then
        [ -n "${LDAP_ONLY-}" ] || {
            local delete_user__homedir

            ldap_resolve_user_homedir delete_user__homedir "$_user_cn" || {
                bb_msg err \
                    "skipping cause unable to resolv users homedir: $_user_cn"
                return 1
            }

            local _user_home_server _user_homedir
            if [[ "$delete_user__homedir" =~ ^.+:.*$ ]]
            then
                # homedir on external server
                _user_home_server="${delete_user__homedir%%:*}"
                _user_home_dir="${delete_user__homedir#*:}"
            else
                _user_home_server="localhost"
                _user_home_dir="$delete_user__homedir"
            fi

            local DEL_USER_CN="$_user_cn"
            local DEL_USER_HOMEDIR="$_user_home_dir"
            local HOMEDIR_BACKUP_PATH
            config_read_optional HOMEDIR_BACKUP_PATH \
                "homedir host backup path" "${SECTION-}"
            local HOMEDIR_EXTRA_PATHS
            config_read_optional HOMEDIR_EXTRA_PATHS \
                "homedir host extra paths" "${SECTION-}"

            # FIXME: BACKUP_EXCLUDE_PATHS should better be an array
            # shellcheck disable=SC2206
            local -a BACKUP_EXCLUDE_PATHS=(${BACKUP_EXCLUDE_PATHS-})

            # FIXME: HOMEDIR_HOST_EXTRA_PATHS should better be an array
            # shellcheck disable=SC2206
            local -a DEL_MUL_EXTRA_PATHS=($HOMEDIR_HOST_EXTRA_PATHS)

            local -a DEL_MUL_CNS=("$DEL_USER_CN")
            local -a DEL_MUL_HOMEDIRS=("$DEL_USER_HOMEDIR")
            local DEL_MUL_NAME="user-$_user_cn"

            homedir_host_helper "$_user_home_server" delete_multiple_userdata \
                HOMEDIR_BACKUP_PATH BACKUP_EXCLUDE_PATHS \
                DEL_MUL_NAME DEL_MUL_CNS DEL_MUL_HOMEDIRS \
                DEL_MUL_EXTRA_PATHS DEL_MUL_NAME || {
                bb_msg err "error while removing users homedir: $_user_cn"
                return 1
            }
            bb_msg debug "removed userdata for: $_user_cn ($_user_home_dir)"
        }

        if ldap_cmd write ldapdelete -c "${delete_user__dns[@]}"
        then
            [ -z "${POST_DELETE_USER_HOOK-}" ] || {
                if [ -z "${DRYRUN-}" ]
                then
                    bb_msg debug "delete_user: calling post delete user" \
                        "hook: $POST_DELETE_USER_HOOK"
                    $POST_DELETE_USER_HOOK "$_user_cn" || {
                        bb_msg err "post delete user hook failed for" \
                            "cn '$_user_cn': $?"
                    }
                else
                    # shellcheck disable=SC2086
                    bb_msg info "[dry run] calling post delete user hook:" \
                        $POST_DELETE_USER_HOOK "$_user_cn"
                fi
            }
        else
            bb_msg err "failed to ldapdelete DNs: ${delete_user__dns[*]}"
        fi
    else
        bb_msg err "skipping cause unable to resolv users DNs: $_user_cn"
    fi
}

function main() {
    # shellcheck disable=SC2119
    (( $# > 0 )) || local_usage 1 "Missing mandatory argument"

    config_init
    config_read_userdel "${SECTION-}"

    # read target CNs from pipe if requested
    local -a _target_cns
    if [[ "$#" == "1" && "$1" == "-" ]]
    then
        if [ -t 0 ]
        then
            bb_quit 1 "arg '-' while stdin is a terminal but must not be one"
        fi

        readarray -t _target_cns
    else
        # target CNs are specified as args
        _target_cns=("$@")
    fi

    local _current_cn
    local -i _okays=0
    for _current_cn in "${_target_cns[@]}"
    do
        if delete_user "$_current_cn"
        then
            _okays=$((_okays + 1))
        else
            bb_msg err "failed to delete user with cn: $_current_cn"
        fi
    done

    [ -z "${POST_DELETE_USERS_HOOK-}" ] || {
        if (( _okays == 0 ))
        then
            bb_msg info "did not create any users," \
                "skipping 'post delete users hook'"
        else
            if [ -z "${DRYRUN-}" ]
            then
                bb_msg debug "main: calling post delete users hook:" \
                    "$POST_DELETE_USERS_HOOK"
                $POST_DELETE_USERS_HOOK || \
                    bb_msg err "ERROR: post delete users hook failed: $?"
            else
                bb_msg info "[dry run] calling post delete users hook:" \
                    "$POST_DELETE_USERS_HOOK"

            fi
        fi
    }
}

parse_common_args main "" "" "$@"
bb_quit
