# shellcheck shell=dash

xrc:mod:lib     pacman      __xmirror/la

___x_cmd_pacman___xmirror(){
    local ___X_CMD_PACMAN_MIRROR_SOURCES='/etc/pacman.d/mirrorlist'
    ___x_cmd_pacman___xmirror___ensure || return $?

    [ "$#" -gt 0 ] || { ___x_cmd_pacman___xmirror___app ; return ; }

    local op="$1";      shift
    case "$op" in
        -h|--help)
                ___x_cmd help -m pacman mirror                 "$@" ;;
        la|ls|replace|current|rollback)
                ___x_cmd_pacman___xmirror_"${op}"              "$@" ;;
        set)    ___x_cmd_pacman___xmirror_replace              "$@" ;;
        unset)  ___x_cmd_pacman___xmirror_rollback             "$@" ;;
        *)      N=pacman M="subcommand not found."   log:ret:1      ;;
    esac
}

___x_cmd_pacman___xmirror___ensure(){
    ___x_cmd_hascmd pacman || N=pacman M="[command=pacman] not found." log:ret:1
}

___x_cmd_pacman___xmirror___app(){
    local _SELECT
    ___x_cmd ui select "_SELECT" \
        "Methods:" \
            "Set pacman mirror (default is ali)" \
            "Get current pacman mirror" \
            "List all the pacman mirror candidates" \
            "Rollback the pacman mirror to the original official"

    case "$_SELECT" in
        1)  ___x_cmd_pacman___xmirror replace       ;;
        2)  ___x_cmd_pacman___xmirror current       ;;
        3)  ___x_cmd_pacman___xmirror ls            ;;
        4)  ___x_cmd_pacman___xmirror rollback      ;;
        *)  pacman:info "Canceled" ;        return 1 ;;
    esac
}

___x_cmd_pacman___xmirror_ls(){
    printf "%s\n" \
        "Code       Url                                    Name"                \
        "ali        https://mirrors.aliyun.com             阿里云镜像"            \
        "tuna       https://mirrors.tuna.tsinghua.edu.cn   清华大学镜像"          \
        "ustc       https://mirrors.ustc.edu.cn            中国科学技术大学镜像"    \
        "bfsu       https://mirrors.bfsu.edu.cn            北京外国语大学镜像"     \
        "sjtu       https://mirror.sjtu.edu.cn             上海交通大学镜像"
}

___x_cmd_pacman___xmirror_advise_ls(){
    ___x_cmd_pacman___xmirror_ls | ___x_cmd_cmds_awk 'NR >1 { print $1 }'
}

___x_cmd_pacman___xmirror_current(){
    ___x_cmd_cmds_cat "$___X_CMD_PACMAN_MIRROR_SOURCES"
}

___x_cmd_pacman___xmirror___url(){
    ___x_cmd_pacman___xmirror_ls | \
        ___x_cmd_mirror___util_get_url_by_name "$1"
}

___x_cmd_pacman___xmirror_replace(){
    [ "$#" -gt 0 ] ||   set -- tuna
    case "$1" in
        -h|--help)  ___x_cmd help -m pacman mirror set "$@";    return ;;
    esac

    ___x_cmd_pacman___xmirror_save || N=mirror M="Save pacman original config failed." log:ret:1

    local url
    url="$(___x_cmd_pacman___xmirror___url "${1}")" || return
    if [ -z "$url" ]; then
        pacman:error "Invalid mirror name: $1"
        return 1
    fi
    pacman:info "Setting pacman mirror $url"

    # ___x_cmd_proxy___util_backup "$___X_CMD_PACMAN_MIRROR_SOURCES" pacman

    ___x_cmd os arch_
    local repo_arch='archlinux/$repo/os/$arch'
    [ "$___X_CMD_OS_ARCH_" = "x64" ] || repo_arch='archlinuxarm/$arch/$repo'


    if [ "$(id -u)" -ne 0 ]; then
        pacman:warn "using sudo"
        printf "Server = %s\n" "${url}/${repo_arch}" | ___x_cmd sudo tee "$___X_CMD_PACMAN_MIRROR_SOURCES" > /dev/null
        ___x_cmd sudo pacman -Syyu --noconfirm
    else
        printf "Server = %s\n" "${url}/${repo_arch}" > "$___X_CMD_PACMAN_MIRROR_SOURCES"
        ___x_cmd_cmds pacman -Syyu --noconfirm
    fi
}

___x_cmd_pacman___xmirror_save(){
    ___x_cmd_mirror___util_save "$___X_CMD_PACMAN_MIRROR_SOURCES" "pacman"
}

___x_cmd_pacman___xmirror_rollback(){
    ___x_cmd_mirror___util_rollback_original "$___X_CMD_PACMAN_MIRROR_SOURCES" "pacman" || return
    ___x_cmd rmrf "$___X_CMD_ROOT_DATA/mirror/pacman"

    if [ "$(id -u)" -ne 0 ]; then
        ___x_cmd sudo pacman -Syyu --noconfirm
    else
        ___x_cmd_cmds pacman -Syyu --noconfirm
    fi
}


