
___x_cmd_claude_setting(){
    [ $# -gt 0 ] || set -- --help

    local op="$1"; shift
    case "$op" in
        -h|--help)          ___x_cmd help -m claude setting "$@"; return 0 ;;
        cat)                ___x_cmd_claude_setting_cat     "$@" ;;
        init)               ___x_cmd_claude_setting_init    "$@" ;;
        rm|remove)          ___x_cmd_claude_setting_rm      "$@" ;;
        path)               ___x_cmd_claude_setting_path    "$@" ;;
        *)                  N=claude M="Unknown subcmd -> $op" log:ret:64 ;;
    esac
}

___x_cmd_claude_setting_cat(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m claude setting cat "$@"; return 0 ;;
            *)              break ;;
        esac
    done

    local x_
    ___x_cmd_claude_setting_locate_ "$@" || {
        claude:warn "Cannot find settings.local.json"
        return 1
    }
    ___x_cmd rat "$x_"
}

___x_cmd_claude_setting_init(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m claude setting init "$@"; return 0 ;;
            *)              break ;;
        esac
    done

    local x_
    ___x_cmd_claude_setting_locate_or_create_ "$@" || return $?
    claude:info "Settings file created/located at: $x_"
}

___x_cmd_claude_setting_rm(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m claude setting rm "$@"; return 0 ;;
            *)              break ;;
        esac
    done

    local x_
    ___x_cmd_claude_setting_locate_ "$@" || {
        claude:warn "Cannot find settings.local.json"
        return 1
    }

    ___x_cmd rmrf "$x_" || return $?
    claude:info "Settings file removed: $x_"
}

___x_cmd_claude_setting_path(){
    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)      ___x_cmd help -m claude setting path "$@"; return 0 ;;
            *)              break ;;
        esac
    done

    local x_
    ___x_cmd_claude_setting_locate_ "$@" || {
        claude:warn "Cannot find settings.local.json"
        return 1
    }
    printf "%s\n" "$x_"
}

___x_cmd_claude_globalsetting_locate_or_create_(){
    [ -f "$HOME/.claude/settings.json" ] || ___x_cmd fprintf "$HOME/.claude/settings.json" "{}"
    x_="$HOME/.claude/settings.json"
}

___x_cmd_claude_globalsetting_locate_(){
    [ -f "$HOME/.claude/settings.json" ] || return 1
    x_="$HOME/.claude/settings.json"
}

___x_cmd_claude_setting_locate_or_create_(){
    local settings_file="${1:-".claude/settings.local.json"}"

    local start_searching="$PWD"
    if ___x_cmd locatefolder_ "$start_searching" "$settings_file"; then
        x_="${x_}/$settings_file"
    elif ___x_cmd locatefolder_ "$start_searching" ".claude"; then
        x_="${x_}/$settings_file"
    elif ___x_cmd locatefolder_ "$start_searching" ".git"; then
        claude:info "Cannot find .claude folder, but found .git folder -> $x_"
        claude:info "Will create .claude folder in $x_"
        x_="${x_}/$settings_file"
    elif ___x_cmd locatefolder_ "$start_searching" ".x-cmd"; then
        claude:info "Cannot find .claude folder, but found .x-cmd folder -> $x_"
        claude:info "Will create .claude folder in $x_"
        x_="${x_}/$settings_file"
    else
        N=claude M="Cannot locate any .claude, .git, .x-cmd folder in $start_searching" log:ret:1
    fi

    [ -f "$x_" ] || {
        ___x_cmd mkdirp "${x_%/*}" || {
            claude:error "Fail to create folder -> ${x_%/*}"
            return 1
        }
        ___x_cmd fprintf "${x_}" "{}"
    }
}

___x_cmd_claude_setting_locate_(){
    local settings_file="${1:-".claude/settings.local.json"}"

    if ___x_cmd locatefolder_ "$PWD" "$settings_file"; then
        x_="$x_/$settings_file"
    elif ___x_cmd locatefolder_ "$PWD" ".claude/"; then
        return 1
    fi

}
