# shellcheck shell=dash

___X_CMD_GIT_CLONE_HOST="${___X_CMD_GIT_CLONE_HOST:-"github.com"}"

___x_cmd_git_clone(){
    ___x_cmd_git_clone___main "$@" || return
    local code=$?
    if [ "$code" = 0 ]; then
        local clonefolder; eval clonefolder="\$$#"
        [ -d "$clonefolder" ] || {
            clonefolder="${clonefolder##*/}"
            clonefolder="${clonefolder%.git}"
            [ -d "$clonefolder" ]
        } && (
            ___x_cmd_inner_cd "$clonefolder" || return
            ___x_cmd gitconfig apply
        )
    fi

    return "$code"
}

command -v ___x_cmd_git_clone___defaultowner 1>/dev/null || {
    ___x_cmd_git_clone___defaultowner(){
        if [ -z "$___X_CMD_GH_CURRENT_owner" ]; then
            xrc gh
            local ___X_CMD_GH_CURRENT_owner=""
            if ! ___X_CMD_GH_CURRENT_owner="$(___x_cmd_gh_cfg get owner)"; then
                x log :gh warn      "There is no default owner found."
                x log :gh error     "Please specify an owner for repo: ${1}"
                return 1
            fi
        fi
        printf "%s\n" "$___X_CMD_GH_CURRENT_owner"
    }
}

___x_cmd_git_clone___main(){
    local ___X_CMD_GIT_CLONE_OPTS='';
    while [ "$#" -gt 0 ]; do
        case "$1" in
            --*=*)
                x cmdstr ___X_CMD_GIT_CLONE_OPTS "$1"
                shift
                ;;
            -o|-b|-u|--reference|--separate-git-dir|--depth|--jobs)
                x cmdstr ___X_CMD_GIT_CLONE_OPTS "$1" "$2"
                shift 2
                ;;
            --)
                x cmdstr ___X_CMD_GIT_CLONE_OPTS "$1"
                shift
                break
                ;;
            -*)
                x cmdstr ___X_CMD_GIT_CLONE_OPTS "$1"
                shift
                ;;
            *)
                break
                ;;
        esac
    done

    local repo="$1"
    local directory="$2"

    local x_=
    ___x_cmd_git_clone___repo_ "$repo" || return

    set -- "$x_" ${directory:+"$directory"}
    eval set -- ___x_cmd___git_origin clone $___X_CMD_GIT_CLONE_OPTS "\"\$@\""
    git:debug "$@"
    "$@"
}

___x_cmd_git_clone___repo_(){
    x_="$1"

    local url; case "$x_" in
        :http/*|:h/*)   x_="${x_#*/}";      url=https://$___X_CMD_GIT_CLONE_HOST/   ;;
        :git/*|:g/*)    x_="${x_#*/}";      url=git@$___X_CMD_GIT_CLONE_HOST:       ;;

        :gh/*)          x_="${x_#*/}";      url=git@github.com:       ;;
        :gt/*)          x_="${x_#*/}";      url=git@gitee.com:        ;;
        :gl/*)          x_="${x_#*/}";      url=git@gitlab.com:       ;;
        :cb/*)          x_="${x_#*/}";      url=git@codeberg.org:     ;;

        :hgh/*)         x_="${x_#*/}";      url=https://github.com/   ;;
        :hgt/*)         x_="${x_#*/}";      url=https://gitee.com/    ;;
        :hgl/*)         x_="${x_#*/}";      url=https://gitlab.com/   ;;
        :hgc/*)         x_="${x_#*/}";      url=https://gitcode.net/  ;;

        # *)              url=git@$___X_CMD_GIT_CLONE_HOST:             ;;
        *)
                        [ -n "$___X_CMD_GIT_CLONE_HOST" ] || return 0
                        url=git@$___X_CMD_GIT_CLONE_HOST:
                        ;;
    esac

    case "$x_" in
        https://*/*|git@*:*)      ;;
        */*)
            x_="${url}${x_}" ;;
        *)
            local owner; owner="$(___x_cmd_git_clone___defaultowner "$x_")" || return 1
            x_="${url}${owner}/${x_}"
            ;;
    esac
}
