#!/bin/bash
SOURCE="$0"
source /usr/lib/elive-tools/functions
EL_REPORTS="1"
#el_make_environment

verify_version_at_least(){
    local package version_min version_installed
    package="$1"
    version_min="$2"

    if [[ -n "$package" ]] && [[ -n "$version_min" ]] ; then
        version_installed="$( COLUMNS=1000 dpkg -l | grep -E "^(hi|ii)" | awk -v package="$package" '{if ($2 == package) print $3}' | grep "[[:digit:]]" | tail -1 )"
        if [[ -n "$version_installed" ]] ; then
            if dpkg --compare-versions "$version_installed" "ge" "$version_min" ; then
                return 0
            else
                return 1
            fi
        else
            # not installed, do not set it as a candidate
            return 1
        fi
    else
        # wrong call?
        return 1
    fi
}
main(){
    # pre {{{
    local url elive_version is_wheezy browsers arg

    # wheezy
    if grep -qsE "(^7\.|wheezy)" /etc/debian_version ; then
        is_wheezy=1
    fi

    # }}}
    # smart arguments parser
    for arg in "$@"
    do
        case "$arg" in
            "-w"|"--wait")
                is_wait=1
                shift
                ;;
            http*|file://*|www.*)
                el_array_member_add "$arg" "${urls[@]}" ; urls=("${_out[@]}")
                el_debug "added url '${arg}' "
                shift
                ;;
            chrome|google-chrome|chromium|firefox|firefox-esr|iceweasel|links2|lynx|w3m|netsurf|surf|palemoon)
                el_array_member_add "${arg}" "${browsers[@]}" ; browsers=("${_out[@]}")
                el_debug "added browser preference '${arg}' "
                shift
                ;;
            --app=*)
                is_mode_app=1
                # get normal urls, we will use app later
                el_array_member_add "${arg#--app=}" "${urls[@]}" ; urls=("${_out[@]}")
                el_debug "added url '${arg#--app=}' in APP mode"
                if [[ "${arg#--app=}" != http* ]] && [[ "${arg#--app=}" != file* ]] ; then
                    el_warning "url doesn't starts with http or file (needed for the --app= argument), disabling mode_app..."
                    unset is_mode_app
                fi
                shift
                ;;
            --incognito|--private-window)
                is_mode_incognito=1
                el_debug "mode incognito"
                shift
                ;;
            --temp-profile)
                el_debug "mode temporal profile"
                is_mode_temp_profile=1
                shift
                ;;
            --delay=*)
                delayed_seconds="${arg#--delay=}"
                is_delayed=1
                el_debug "delayed ${delayed_seconds} seconds"
                ;;
            --*)
                el_warning "ignoring unrecognized option $arg"
                shift
                ;;
            *)
                el_array_member_add "$arg" "${urls[@]}" ; urls=("${_out[@]}")
                el_debug "added url '${arg}' (assumed)"
                shift
                ;;
        esac
    done

    # add possible ones based in preference
    if ((is_mode_app)) ; then
        # try to use the app mode as much as possible in chrome, because it looks much better with it, so lower the min version for chrome (unless specified in the launcher command)
        # versions included in wheezy
        if verify_version_at_least "google-chrome-stable" "48" ; then
            el_array_member_add "chrome" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
        if verify_version_at_least "chromium" "37" ; then
            el_array_member_add "chromium" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
        # less preference for firefox because it doesn't has an "app" mode
        if verify_version_at_least "firefox-esr" "52" ; then
            el_array_member_add "firefox-esr" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
    else
        # versions-based preferences
        if verify_version_at_least "google-chrome-stable" "57" ; then
            el_array_member_add "chrome" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
        if verify_version_at_least "chromium" "57" ; then
            el_array_member_add "chromium" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
        # less preference for firefox because it doens't has an "app" mode
        if verify_version_at_least "firefox-esr" "52" ; then
            el_array_member_add "firefox-esr" "${browsers[@]}" ; browsers=("${_out[@]}")
        fi
    fi
    # fallback default preferences
    el_array_member_add "chrome" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "chromium" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "firefox-esr" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "firefox" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "iceweasel" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "palemoon" "${browsers[@]}" ; browsers=("${_out[@]}")
    # lower alternatives
    el_array_member_add "surf" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "netsurf" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "links2" "${browsers[@]}" ; browsers=("${_out[@]}")
    el_array_member_add "/etc/alternatives/x-www-browser" "${browsers[@]}" ; browsers=("${_out[@]}")

    # manage special cases {{{
    case "$url" in
        *ted.com*)
            # chromium not works on this version, only chrome and iceweasel
            if ((is_wheezy)) ; then
                el_array_member_unset "chromium" "${browsers[@]}" ; browsers=("${_out[@]}")
            fi
            ;;
    esac

    # }}}

    for browser in ${browsers[@]}
    do
        case "$browser" in
            chrome|google-chrome|chromium)
                # fix
                if [[ "$browser" = "chrome" ]] ; then
                    if [[ -x "$( which "$browser" )" ]] ; then
                        browser="$( which "${browser}" )"
                    else
                        if [[ -x "$( which "google-$browser" )" ]] ; then
                            browser="$( which "google-${browser}" )"
                        fi
                    fi
                fi
                if [[ -x "$( which "$browser" )" ]] ; then
                    browser="$( which "${browser}" )"
                    el_debug "prefered browser: $browser"

                    # only chromium has temporal profile
                    if ((is_mode_temp_profile)) && [[ "$browser" = "chromium" ]] ; then
                        el_array_member_add "--temp-profile" "${browser_options[@]}" ; browser_options=("${_out[@]}")
                    fi
                    if ((is_mode_incognito)) ; then
                        el_array_member_add "--incognito" "${browser_options[@]}" ; browser_options=("${_out[@]}")
                    fi
                    # works for both chrome/chromium, but http:// is needed to be passed instead of httpS:// (duh)
                    if ((is_mode_app)) ; then
                        preurl="--app="
                    fi

                    break
                fi
                ;;
            iceweasel|firefox|firefox-esr|palemoon)
                if [[ -x "$( which "$browser" )" ]] ; then
                    # always use firefox-esr as preference (args like --new-window dont works if not)
                    if [[ -x "$( which "firefox-esr" )" ]] ; then
                        browser="$( which "${browser}" )"
                    else
                        browser="$( which "${browser}" )"
                    fi

                    el_debug "prefered browser: $browser"

                    # notes:
                    # new-window doesn't always works, only if we have an already-running session/instance
                    # new-instance doesn't works at all (if you have already an instance running), so it can bug! dont use it
                    if ((is_mode_app)) ; then
                        preurl="--new-window " # keep space
                    fi
                    if ((is_mode_incognito)) ; then
                        el_array_member_add "--private-window" "${browser_options[@]}" ; browser_options=("${_out[@]}")
                    fi

                    break
                fi
                ;;
            surf|netsurf)
                if [[ -x "$( which "$browser" )" ]] ; then
                    browser="$( which "${browser}" )"
                    el_debug "prefered browser: $browser"

                    break
                fi
                ;;
            links2*)
                if [[ -x "$( which "$browser" )" ]] ; then
                    if [[ -n "$DISPLAY" ]] ; then
                        browser="$( which "${browser}" ) -g"
                    else
                        browser="$( which "${browser}" )"
                    fi
                    el_debug "prefered browser: $browser"

                    break
                fi
                ;;
            lynx|w3m)
                if [[ -x "$( which "$browser" )" ]] ; then
                    browser="urxvt -e bash -c '$( which "${browser}" )'"
                    el_debug "prefered browser: $browser"

                    break
                fi
                ;;
            *)
                if ! [[ -e "$browser" ]] ; then
                    unset browser
                fi
                ;;
        esac
    done

    # nothing used? open with a default one
    if ! [[ -n "$browser" ]] && [[ -e "/etc/alternatives/x-www-browser" ]] ; then
        browser="$( readlink -f "/etc/alternatives/x-www-browser" )"
    fi
    if ! [[ -n "$browser" ]] ; then
        el_error "no web browsers available found"
        $guitool --error --text="No web browsers installed found, please install one first"
    fi

    # run the webs
    for url in "${urls[@]}"
    do
        if ((is_delayed)) ; then
            LC_ALL=C sleep $delayed_seconds
        fi

        ${browser} ${browser_options[@]} ${preurl}"${url}" 1>/dev/null 2>&1 &

        # don't bottleneck opening tabs
        LC_ALL=C sleep 2
    done

    # wait that all the browsers are finished? useful for wait the process, but:
    # note: it would be useful to wait the process that has finished, but if we are opening to a tab (like in chrome), the process is just run in BG, not waiting for it, so this is not so reliable...
    if ((is_wait)) ; then
        wait
    fi
}

#
#  MAIN
#
main "$@"

# vim: set foldmethod=marker :
