#!/bin/bash
SOURCE="$0"
source /usr/lib/elive-tools/functions
EL_REPORTS="1"
el_make_environment
# gettext functions
if [[ -x "/usr/bin/gettext.sh" ]] ; then
    . gettext.sh
else
    # make it compatible
    eval_gettext(){
        echo "$@"
    }
fi
TEXTDOMAIN="deliver"
export TEXTDOMAIN


# determine the mount version
if grep -qsE "(^7\.|wheezy)" /etc/debian_version ; then
    LIVE_MOUNT_MAIN_d="/lib/live/mount"
else
    LIVE_MOUNT_MAIN_d="/run/live"
fi

main(){
    # pre {{{
    local arg 

    for arg in "$@"
    do
        case "$arg" in
            -s)
                is_soft_mode=1
                ;;
        esac
    done

    # only show one time per boot
    if el_flag check persistence-statistics && ((is_soft_mode)) ; then
        exit 0
    fi

    # defaults
    counter_times_persistence_booted="0"

    # get values
    if [[ -r "/etc/default/persistence-elive.sh" ]] ; then
        source "/etc/default/persistence-elive.sh"
    fi


    # - pre }}}

    # get the partiton where the live system is mounted
    medium_part="$( cat /proc/mounts | grep "^/dev/.*${LIVE_MOUNT_MAIN_d}/medium" | awk '{print $1}' | grep -v "/dev/mapper/" | tail -1 )"
    if [[ ! -b "$medium_part" ]] ; then
        # this is like a strange buggy useless remount that happens here, replacing the previous one
        if ls $LIVE_MOUNT_MAIN_d/persistence/*/live/filesystem.*  1>/dev/null 2>&1 ; then
            medium_part="$( ls $LIVE_MOUNT_MAIN_d/persistence/*/live/filesystem.* | sed -e 's|/live/filesystem\..*$||g' | sort -u | head -1 )"
            medium_part="$( cat /proc/mounts | grep "${medium_part}" | awk '{print $1}' | tail -1 )"
        fi
        if [[ ! -b "$medium_part" ]] ; then
            medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/sd.3" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
            if [[ ! -b "$medium_part" ]] ; then
                medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/sd.2" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                if [[ ! -b "$medium_part" ]] ; then
                    medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/sd.1" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                    if [[ ! -b "$medium_part" ]] ; then
                        medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/sd.4" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                        if [[ ! -b "$medium_part" ]] ; then
                            medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/sd.5" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                            if [[ ! -b "$medium_part" ]] ; then
                                # nvme ?
                                medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/nvme" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                                if [[ ! -b "$medium_part" ]] ; then
                                    medium_part="$( cat /proc/mounts | grep "${LIVE_MOUNT_MAIN_d}/persistence/mmcblk" | awk '{print $1}' | grep "^/dev/" | grep -Fv "/dev/mapper/" | tail -1 )"
                                fi
                            fi
                        fi
                    fi
                fi
            fi
        fi
        # try to detect systems like /dev/mapper/ventoy that doesn't exist on /dev/mapper/ later
        if [[ ! -b "$medium_part" ]] ; then
            medium_part="$( cat /proc/mounts | grep "^/dev/.*${LIVE_MOUNT_MAIN_d}/medium" | awk '{print $1}' | tail -1 )"
            if [[ "$medium_part" = "/dev/mapper/"* ]] ; then
                medium_part="${medium_part#/dev/mapper/}"
                if [[ -n "$medium_part" ]] ; then
                    medium_part="$( sudo -H partitions-list --show-all 2>/dev/null | grep -i "$medium_part" |  awk -v FS="::" '{print $1}' | tail -1 )"
                fi
            fi
        fi
    fi
    if [[ "$medium_part" = "/dev/nvme"* ]] || [[ "$medium_part" = "/dev/mmcblk"* ]] ; then
        medium_dev="${medium_part%%p[0-9]*}"
    else
        medium_dev="${medium_part%%[0-9]*}"
    fi
    medium_part_fs="$( sudo -H partitions-list --show-only="$medium_part" | awk -v FS="::" '{print $3}' )"

    # by knowing the disk of the live system we can know from where comes our persistence partition
    persistence_partition="$( sudo -H partitions-list --show-all --show-all-raw 2>/dev/null | grep -E "^${medium_dev}.*::(persistence)::" | awk -v FS="::" '{print $1}' | tail -1 )"
    if [[ -n "$persistence_partition" ]] ; then
        persistence_mountpoint="$( sudo -H mounts-manager --get-mountpoint "$persistence_partition" 2>/dev/null )"

        if [[ -z "$persistence_mountpoint" ]] ; then
            persistence_partition="$( sudo cat /proc/mounts | grep -E "^/dev/.*${LIVE_MOUNT_MAIN_d}/persistence/${persistence_partition##*/}\s+" | awk '{print $1}' )"
            persistence_mountpoint="$( sudo -H mounts-manager --get-mountpoint "$persistence_partition" 2>/dev/null )"
        fi
    fi

    # we are not using persistence, this is not needed and will be buggy too
    if [[ -z "$persistence_partition" ]] || ! [[ "$( sudo -H ls -1 "$persistence_mountpoint" | wc -l )" -gt 1 ]]  ; then
        exit
    fi

    if ! grep -Fqs "persistence_speed" "/etc/default/persistence-elive.sh" ; then
        # put a pause in the start so that the media will be not busy (only first time, to calculate speeds)
        # 1 minutes
        echo -e "Waiting a bit to flush the USB / media usage before to run persistence statistics as first time (wait precaches to finish)..." 1>&2
        # note: we need 222 seconds for the actual precaches to finish, and because it is delayed,
        # note: but the desktop should have been already configured so it should be not really needed
        #sleep 300
        sleep 120
        sync
    fi

    # Note: needed also in hardware-based profiles persistence
    if ! [[ -r "/etc/default/persistence-elive.sh" ]] ; then
        sudo -H bash -c "mkdir -p /etc/default ; echo \"counter_times_persistence_booted=\\\"${counter_times_persistence_booted}\\\"\" > \"/etc/default/persistence-elive.sh\""
    fi

    # update counter
    if ! el_flag check persistence-statistics ; then
        counter_times_persistence_booted="$(( $counter_times_persistence_booted + 1 ))"
        sudo -H sed -i "s|^counter_times_persistence_booted.*$|counter_times_persistence_booted=$counter_times_persistence_booted|g" "/etc/default/persistence-elive.sh"

        el_flag add persistence-statistics
    fi


    if [[ "$medium_part" = "/dev/sr"* ]] ; then
        is_cdrom=1
        is_usb=0
    fi
    if [[ "$medium_part" = "/dev/sd"* ]] ; then
        is_usb=1
        is_cdrom=0
    fi
    if [[ "$medium_part_fs" = "iso9660" ]] ; then
        is_image_hybrid=1
        # can be usb (hybrid)
    fi
    # ventoy cases
    if [[ "$medium_part_fs" = "exfat" ]] && [[ -b /dev/mapper/ventoy ]] ; then
        is_image_hybrid=1
        is_cdrom=0
        is_usb=1
    fi
    if [[ "$medium_part_fs" = "vfat" ]] ; then
        is_image_img=1
        is_cdrom=0
    fi


    # get disk usage
    persistence_usage_available="$( sudo -H LC_ALL=C df -h | grep -F "$persistence_mountpoint" | awk '{print $4}' )"
    persistence_usage_percent="$( sudo -H LC_ALL=C df -h | grep -F "$persistence_mountpoint" | awk '{print $5}' )"


    # get speeds, for this machine (so, always)
    #if [[ -z "$persistence_speed_ro" ]] ; then
        sync
        persistence_speed_ro="$( sudo -H LC_ALL=C hdparm -t "$medium_dev" 2>&1 | grep -F "buffered disk read" | sed -e 's|^.* = ||g' )"
        # remove extra leading blank chars
        read -r persistence_speed_ro <<< "$persistence_speed_ro"
        sudo -H sed -i "/^persistence_speed_ro=/d" "/etc/default/persistence-elive.sh"
        sudo -H bash -c "echo \"persistence_speed_ro=\\\"${persistence_speed_ro}\\\"\" >> \"/etc/default/persistence-elive.sh\""
    #fi

    #if [[ -z "$persistence_speed_rw" ]] ; then
        # first we need to create an image because urandom is not enough fast for the real test
        sudo -H LC_ALL=C dd if=/dev/urandom of=/tmp/speedtest-temp.img bs=8M count=8 oflag=dsync 2>/dev/null || true
        sync
        persistence_speed_rw="$( sudo -H LC_ALL=C dd if=/tmp/speedtest-temp.img of="${persistence_mountpoint}/speedtest-temp.img" bs=8M oflag=dsync 2>&1 | tr ' ' '\n' | tail -n "-2" | tr '\n' ' ' )"
        sudo -H rm -f "${persistence_mountpoint}/speedtest-temp.img"
        sudo -H rm -f "/tmp/speedtest-temp.img"
        # remove extra leading blank chars
        read -r persistence_speed_rw <<< "$persistence_speed_rw"
        sudo -H sed -i "/^persistence_speed_rw=/d" "/etc/default/persistence-elive.sh"
        sudo -H bash -c "echo \"persistence_speed_rw=\\\"$persistence_speed_rw\\\"\" >> \"/etc/default/persistence-elive.sh\""
    #fi


    # machine readable value (in KB)
    if [[ -n "$persistence_speed_ro" ]] ; then
        case "$persistence_speed_ro" in
            *GB*)
                persistence_speed_ro_kb="$( echo "${persistence_speed_ro%% *} * 1024 * 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *MB*)
                persistence_speed_ro_kb="$( echo "${persistence_speed_ro%% *} * 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *KB*)
                persistence_speed_ro_kb="$( echo "${persistence_speed_ro%% *} + 0 " | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *)
                # this should be bytes :/
                persistence_speed_ro_kb="$( echo "${persistence_speed_ro%% *} / 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
        esac
    fi
    if [[ -n "$persistence_speed_rw" ]] ; then
        case "$persistence_speed_rw" in
            *GB*)
                persistence_speed_rw_kb="$( echo "${persistence_speed_rw%% *} * 1024 * 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *MB*)
                persistence_speed_rw_kb="$( echo "${persistence_speed_rw%% *} * 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *KB*)
                persistence_speed_rw_kb="$( echo "${persistence_speed_rw%% *} + 0 " | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
            *)
                # this should be bytes :/
                persistence_speed_rw_kb="$( echo "${persistence_speed_rw%% *} / 1024" | LC_ALL=C bc -l | sed -e 's|\..*$||g' )"
                ;;
        esac
    fi

    local message_1
    message_1="$( printf "$( eval_gettext "Ok" )" "" )"

    local message_2
    #message_2="$( printf "$( eval_gettext "Improve Elive" )" "" )"
    #message_2="$( printf "$( eval_gettext "Donate to Elive" )" "" )"
    message_2="$( printf "$( eval_gettext "Make Elive even better" )" "" )"

    local message_3
    message_3="$( printf "$( eval_gettext "Disable statistics" )" "" )"

    local message_4
    message_4="$( printf "$( eval_gettext "You have booted with persistence %s times" )" "$counter_times_persistence_booted" )"

    local message_5
    message_5="$( printf "$( eval_gettext "You have used %s and still have %s available" )" "$persistence_usage_percent" "${persistence_usage_available}"  )"

    local message_6
    message_6="$( printf "$( eval_gettext "Your persistence media's reading speed is %s" )" "$persistence_speed_ro" )"

    local message_7
    message_7="$( printf "$( eval_gettext "And the effective write speed is %s" )" "$persistence_speed_rw" )"


    if [[ -n "$persistence_speed_rw_kb" ]] ; then
        persistence_speed_rw_kb="$( echo "$persistence_speed_rw_kb" | sed -e 's|\..*$||g' )"

        local message_8

        if [[ "$persistence_speed_rw_kb" -lt 4500 ]] || [[ "$persistence_speed_ro_kb" -lt 20000 ]] ; then
            message_8="$( printf "$( eval_gettext "This speed is not sufficient for a smooth experience with persistence. We suggest acquiring a faster USB memory, such as SanDisk Ultra or Extreme models, which are proven to work very well with Elive." )" "" )"

        elif [[ "$persistence_speed_rw_kb" -lt 16000 ]] ; then
            message_8="$( printf "$( eval_gettext "This speed is acceptable, but for better system performance, consider using a SanDisk Ultra or Extreme USB model, which we have verified to work exceptionally well with Elive." )" "" )"
            is_good_speed=1

        elif [[ "$persistence_speed_rw_kb" -lt 32000 ]] ; then
            message_8="$( printf "$( eval_gettext "This is a very good speed! If you experience slowness on other computers, it might be due to the USB connectors not being 3.0." )" "" )"
            is_good_speed=1

        elif [[ "$persistence_speed_rw_kb" -ge 32000 ]] ; then
            message_8="$( printf "$( eval_gettext "Which is a really good speed!" )" "" )"
            is_good_speed=1
        fi
    fi



    #yad  --center --image "logo-elive" --title "Persistence Statistics" --button="${message_1}:1" --button="${message_2}:0" --button="${message_3}:2" --text="${message_4}"
    # wait a bit before to show the dialog, so that the GTK theme will be set
    sleep 8

    if [[ -n "$message_8" ]] ; then
        yad --width=500 --center --image "logo-elive" --title "Persistence Statistics" --button="${message_1}:1" --button="${message_2}:0" --button="${message_3}:2" --text="${message_4}.\n\n${message_5}.\n\n${message_6}.\n${message_7}.\n\n${message_8}."
    else
        yad --width=500 --center --image "logo-elive" --title "Persistence Statistics" --button="${message_1}:1" --button="${message_2}:0" --button="${message_3}:2" --text="${message_4}.\n\n${message_5}.\n\n${message_6}.\n${message_7}"
    fi
    result="$?"

    if ! ((is_good_speed)) ; then
        warning-messages-elive persistence_is_slow
    fi


    case "$result" in
        0) # donate
            web-launcher "https://www.elivecd.org/donate/?id=system-live-persistence"
            ;;
        1) # Nothing
            true
            ;;
        2) # disable this notification
            sudo rm -f /etc/xdg/autostart/elive-persistence-statistics.desktop 2>/dev/null
            ;;
    esac


}

#
#  MAIN
#
main "$@"

# vim: set foldmethod=marker :
