#!/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"
    }
}

# 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

            resolve_homedir delete_user__homedir \
                            "$_user_cn" "${SECTION-}" || {
                local _ret=$?
                if (( _ret == 2 ))
                then
                    bb_msg err "skipping $_user_cn:" \
                           "LDAP entry differs from config"
                else
                    bb_msg err "skipping $_user_cn: unable to resolve homedir"
                fi
                return 1
            }

            local _user_home_server _user_homedir
            if [[ "$delete_user__homedir" =~ ^([^:]+):(.*)$ ]]
            then
                # homedir on external server
                _user_home_server="${BASH_REMATCH[1]}"
                _user_home_dir="${BASH_REMATCH[2]}"
            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"

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

            # FIXME: HOMEDIR_HOST_EXTRA_DELETE_PATHS should better be an array
            # shellcheck disable=SC2206
            local -a DEL_MUL_EXTRA_PATHS=($HOMEDIR_HOST_EXTRA_DELETE_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_HOST_ARCHIVES_PATH ARCHIVE_EXCLUDES \
                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
            if (( ${#POST_DELETE_USER_HOOK[@]} > 0 ))
            then
                dw_run "${POST_DELETE_USER_HOOK[@]}" "$_user_cn" || {
                    bb_msg err "post delete user hook failed for" \
                        "cn '$_user_cn': $?"
                }
            fi
        else
            bb_msg err "failed to ldapdelete DNs: ${delete_user__dns[*]}"
        fi
    else
        bb_msg err "skipping $_user_cn: unable to resolve user DNs"
    fi
}

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

    config_init
    config_read_userdel "${SECTION-}"

    # Warnung wenn keine Section angegeben
    if [ -z "${SECTION-}" ]
    then
        bb_msg warning "no section specified, users without autofs entry will be skipped"
    fi

    # 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

    if (( ${#POST_DELETE_USERS_HOOK[@]} > 0 ))
    then
        if (( _okays == 0 ))
        then
            bb_msg info "did not delete any users," \
                "skipping 'post delete users hook'"
        else
            dw_run "${POST_DELETE_USERS_HOOK[@]}" || \
                bb_msg err "ERROR: post delete users hook failed: $?"
        fi
    fi
}

parse_common_args main "" "" "$@"
bb_quit
