#!/bin/sh
# author jjm2473

# the script will be excuted when `argon.@global[0].bing_background == '1'`
# defaults to 'bing' to be compatible with old config
WEB_PIC_SRC=$(uci -q get argon.@global[0].online_wallpaper || echo 'bing')
CACHE=/var/run/argon_${WEB_PIC_SRC}.url
WRLOCK=/var/lock/argon_${WEB_PIC_SRC}.lock

fetch_pic_url() {
    case $WEB_PIC_SRC in
    bing)
        local picpath=$(curl -fks --max-time 3 \
            "https://www.bing.com/HPImageArchive.aspx?format=js&n=1" |
            jsonfilter -qe '@.images[0].url')
        [ -n "${picpath}" ] && echo "//www.bing.com${picpath}"
        ;;
    unsplash)
        curl -fks --max-time 3 \
            "https://source.unsplash.com/1920x1080/daily?wallpapers" |
            sed -E 's#^.*href="([^?]+)\?.*$#\1?fm=jpg\&fit=crop\&w=1920\&h=1080#'
        ;;
    unsplash_*)
        local collection_id=${WEB_PIC_SRC#unsplash_}
        curl -fks --max-time 3 \
            "https://source.unsplash.com/collection/${collection_id}/1920x1080" |
            sed -E 's#^.*href="([^?]+)\?.*$#\1?fm=jpg\&fit=crop\&w=1920\&h=1080#'
        ;;
    wallhaven)
        curl -fks --max-time 3 \
            "https://wallhaven.cc/api/v1/search?resolutions=1920x1080&sorting=random" |
            jsonfilter -qe '@.data[0].path'
        ;;
    esac
}

try_update() {
    local lock="$WRLOCK"
    exec 200>$lock

    if flock -n 200 >/dev/null 2>&1; then
        local picurl=$(fetch_pic_url)
        if [ -n "$picurl" ]; then
            echo "${picurl}" | tee "$CACHE"
        else
            if [ -s "$CACHE" ]; then
                cat "$CACHE"
            else
                touch "$CACHE"
            fi
        fi
        flock -u 200 >/dev/null 2>&1
    elif [ -s "$CACHE" ]; then
        cat "$CACHE"
    fi
}

get_url() {
    if [ -f "$CACHE" ]; then
        local idle_t=$(($(date '+%s') - $(date -r "$CACHE" '+%s' 2>/dev/null || echo '0')))
        if [ -s "$CACHE" ]; then
            if [ $idle_t -le 43200 ]; then
                cat "$CACHE"
                return
            fi
        else
            if [ $idle_t -le 120 ]; then
                return
            fi
        fi
    fi
    try_update
}

get_url
