# shellcheck shell=dash disable=SC2016
# x version release sync
# x version release sync all [version]
# x version release sync gh/gt/cb [version]
# x version release syncall gh/gt/cb [version]

___x_cmd_version___release_sync(){
    local repo="x-cmd/x-cmd"
    local title
    local version
    local state="";
    local mod="all"

    while [ $# -gt 0 ];do
        case "${1}" in
            --title)
                        title="${2}"
                        [ $# -ge 2 ] || M="Please provide title"  log:ret:64
                        shift 2 ;;
            *)          break ;;
        esac
    done

    mod="${1:-"all"}"

    local version_data="$( ___x_cmd_version_ls_json | ___x_cmd ja 'kpglob("1", "*"){if(v()=="{")print  k()}')"

    local cur_version
    local old_version
    {
        read -r cur_version
        read -r old_version
    }<<A
$version_data
A

    target_version="${2:-"$cur_version"}"
    local x_; ___x_cmd_version___release_check_ "$target_version" ; state="$x_"
    ___x_cmd_version___release_sync_ "$mod" "$target_version" "$title" "$state" "$repo"

    if [ "$target_version" = "$cur_version" ]; then
        state=""; ___x_cmd_version___release_check_ "$old_version"; state="$x_"
        ___x_cmd_version___release_sync_ "$mod" "$old_version" "" "$state" "$repo"
    fi
}

___x_cmd_version___release_check_(){
    local target_version="$1"
    local beta="$( ___x_cmd_version_ls_json | ___x_cmd jq -r ".[\"$target_version\"].beta" )"
    local latest="$( ___x_cmd_version_ls_json | ___x_cmd jq -r ".[\"$target_version\"].latest" )"

    x_=""
    [ "$beta" != "true" ]   || x_="--prerelease"
    [ "$latest" != "true" ] || x_="--latest"
}

___x_cmd_version___release_sync_(){
    local mod="$1"
    local version="$2"
    local title="$3"
    local state="$4"
    local repo="$5"

    if [ -z "$title" ]; then
        title="$(___x_cmd_version_ls_json | ___x_cmd jq -r ".[\"$version\"].name")"
        [ -n "$title" ] || title="$version"
    fi

    local desc
    desc="$(___x_cmd version release tomd "$version")"

    if [ "$mod" = "all" ]; then
        local p
        for p in gh gt cb; do
            ___x_cmd_version___release_sync_platform "$p" "$version" "$title" "$desc" "$state" "$repo"
        done
    else
        ___x_cmd_version___release_sync_platform "$mod" "$version" "$title" "$desc" "$state" "$repo"
    fi
}

___x_cmd_version___release_sync_platform(){
    local mod="$1"
    local version="$2"
    local title="$3"
    local desc="$4"
    local state="$5"
    local repo="$6"

    local platform_desc="$desc"
    local platform_domain

    case "$mod" in
        gt)
            platform_desc="$(___x_cmd version release tomd --cn "$version")"
            platform_domain="gitee.com" ;;
        cb)
            platform_domain="codeberg.org" ;;
    esac

    if [ -n "$platform_domain" ]; then
        platform_desc="$(printf "%s" "$desc" \
            | ___x_cmd_cmds awk -v domain="$platform_domain" '{
if ( $0 ~ "github.com/x-cmd/x-cmd/compare" ) {
    gsub("github.com/x-cmd/x-cmd/compare", domain"/x-cmd/x-cmd/compare", $0);
}
if ( $0 ~ "en.webp" ) {
    gsub("en.webp", "cn.webp", $0);
}
print $0
}')"
    fi
    release_id="$(___x_cmd "$mod" repo release ls --csv --repo "$repo" \
        | ___x_cmd csv awk -v version="$version" '{ if( cval(3) ~ version ) print cval(1) }' )"
    [ -n "$release_id" ] || N=x M="not found version=$version release" log:ret:1

    if [ "$state" = "--latest" ] && [ "$mod" != "gh" ]; then
        state="";
    fi

    if [ "$mod" = "gt" ]; then
        ___x_cmd gt repo release edit --repo "$repo" --body "$platform_desc" --name "$title" --tag "$version" ${state:+"$state"} "$release_id"
    else
        ___x_cmd "$mod" repo release edit --repo "$repo" --body "$platform_desc" --name "$title" ${state:+"$state"} "$release_id"
    fi
}
