#!/bin/sh
#
# Copyright (C) 2012, 2014, 2016-2017, 2023  Etersoft
# Copyright (C) 2012, 2014, 2016-2017, 2023  Vitaly Lipatov <lav@etersoft.ru>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#

# copied from korinf/tools/run-script/scripts/update

load_helper epm-sh-warmup
load_helper epm-check_updated_repo

# TODO: restore mirroring
get_latest_version()
{
    URL="https://eepm.ru/app-versions"
    #update_url_if_need_mirrored
    local var
    var="$(epm tool eget -q -O- "$URL/$1")" || return
    echo "$var" | head -n1 | cut -d" " -f1
}

__check_for_epm_version()
{
    # skip update checking for eepm from repo (ALT bug #44314)
    [ "$BASEDISTRNAME" = "alt" ] &&  [ "$DISTRVERSION" != "Sisyphus" ] && epm status --original eepm && return

    local latest="$(get_latest_version eepm)"
    #[ -z "$latest" ] && return
    local res="$(epm print compare "$EPMVERSION" "$latest")"
    [ "$res" = "-1" ] && info "Latest EPM version in Korinf repository is $latest. You have version $EPMVERSION running." && info "You can update eepm with \$ epm ei command."
}

__save_available_packages()
{
    [ -d "$epm_vardir" ] || return 0

    # TODO: ignore in docker
    # update list only if the system supports bash completion
    [ -d /etc/bash_completion.d ] || return 0

    # HACK: too much time (5 minutes) on deb systems in a docker
    [ $PMTYPE = "apt-dpkg" ] && return 0

    info "Retrieving list of all available packages (for autocompletion) ..."
    load_helper epm-list_available
    short=--short epm_list_available | sort | sudorun tee $epm_vardir/available-packages >/dev/null
}

__epm_update_content_index()
{
case $BASEDISTRNAME in
    "alt")
        load_helper epm-sh-altlinux-contents-index
        update_alt_contents_index
        return
        ;;
esac

case $PMTYPE in
    apt-dpkg)
        is_command apt-file || return 0
        assure_exists apt-file || return 0
        sudocmd apt-file update
        ;;
esac

}

__epm_update()
{

    [ -z "$*" ] || fatal "No arguments are allowed here"

    info "Running update the package index files from remote package repository database ..."

local ret=0
warmup_hibase

case $BASEDISTRNAME in
    "alt")
        # TODO: hack against cd to cwd in apt-get on ALT
        cd /
        sudocmd apt-get update
        ret="$?"
        cd - >/dev/null
        return $ret
        ;;
esac


case $PMTYPE in
    apt-rpm)
        # TODO: hack against cd to cwd in apt-get on ALT
        cd /
        sudocmd apt-get update
        ret="$?"
        cd - >/dev/null
        return $ret
        ;;
    apt-dpkg)
        sudocmd apt-get update || return
        # apt-get update retrieve Contents file too
        #sudocmd apt-file update
        ;;
    packagekit)
        docmd pkcon refresh
        ;;
    #snappy)
    #    sudocmd snappy
    #    ;;
    aptitude-dpkg)
        sudocmd aptitude update || return
        ;;
    yum-rpm)
        # just skipped
        [ -z "$verbose" ] || info "update command is stubbed for yum"
        ;;
    dnf-rpm)
        # just skipped
        [ -z "$verbose" ] || info "update command is stubbed for dnf"
        ;;
    urpm-rpm)
        sudocmd urpmi.update -a
        ;;
    pacman)
        sudocmd pacman -S -y
        ;;
    aura)
        sudocmd aura -A -y
        ;;
    zypper-rpm)
        sudocmd zypper $(subst_option non_interactive --non-interactive) refresh
        ;;
    emerge)
        sudocmd emerge --sync
        ;;
    slackpkg)
        sudocmd /usr/sbin/slackpkg -batch=on update
        ;;
    deepsolver-rpm)
        sudocmd ds-update
        ;;
    npackd)
        sudocmd packdcl detect # get packages from MSI database
        ;;
    homebrew)
        docmd brew update
        ;;
    opkg)
        sudocmd opkg update
        ;;
    eopkg)
        sudocmd eopkg update-repo
        ;;
    apk)
        sudocmd apk update
        ;;
    nix)
        sudocmd nix-channel --update
        ;;
    pkgsrc)
        # portsnap extract for the first time?
        sudocmd portsnap fetch update
        ;;
    aptcyg)
        sudocmd apt-cyg update
        ;;
    xbps)
        sudocmd xbps-install -S
        ;;
    winget)
        sudocmd winget source update
        ;;
    *)
        fatal "Have no suitable update command for $PMTYPE"
        ;;
esac
}


epm_update()
{
    if [ "$1" = "--content-index" ] ; then
        __epm_update_content_index
        return
    fi

    __epm_update "$@" || return

    __epm_touch_pkg

    __save_available_packages

    __epm_update_content_index

    return 0
}