
___x_cmd_ccal_fzm(){

    while [ $# -gt 0 ]; do
        case "$1" in
            -h|--help)  ___x_cmd help -m ccal fzm "$@"; return 0 ;;
            *)          break ;;
        esac
        shift
    done

    ___x_cmd_ccal_lunar_prepare

    local ___X_CMD_CCAL_FZ_RESULT="${1:-$___X_CMD_CCAL_FZ_RESULT}"

    ___x_cmd_ccal_fz___info

    local ___X_CMD_CCAL_FZ_APP_TYPE=m
    local ___X_CMD_CCAL_FZ_APP_CONT=1
    while [ "$___X_CMD_CCAL_FZ_APP_CONT" -eq 1 ]; do
        "___x_cmd_ccal___fz${___X_CMD_CCAL_FZ_APP_TYPE}"     "$@" || return $?
    done
}

___x_cmd_ccal___fzm(){
    ___x_cmd_ccal_fz___date_ "$___X_CMD_CCAL_FZ_RESULT"
    ___X_CMD_CCAL_FZ_DATE_M="${___X_CMD_CCAL_FZ_DATE_M#0}"
    local cursor_pos="$((  (___X_CMD_CCAL_FZ_DATE_Y - 1900) * 12 + ___X_CMD_CCAL_FZ_DATE_M ))"

    ___x_cmd_ccal_lunar_prepare_index || return $?

    local tmpy; local tmpm; local tmpd;
    local x_

    ___x_cmd storerat_ ___x_cmd_ccal___fzm_fz_ || return $?

    case "$x_" in
        *"|restart|"*)
                ___X_CMD_CCAL_FZ_RESULT="$___X_CMD_CCAL_FZ_DATE_TODAY"
                ;;
        *"|goback|"*)
                ___x_cmd_ccal_fz___read_date_ "${x_}"
                ___X_CMD_CCAL_FZ_RESULT="${x_}-1"
                ___X_CMD_CCAL_FZ_APP_TYPE=y
                ;;

        *"|next-view|"*)
                ___X_CMD_CCAL_FZ_APP_TYPE=d
                return 0
                ;;

        *"|prev-view|"*)
                ___X_CMD_CCAL_FZ_APP_TYPE=y
                return 0
                ;;

        *)
                ___x_cmd_ccal_fz___read_date_ "${x_}"
                ___X_CMD_CCAL_FZ_RESULT="${x_}-1"
                ___X_CMD_CCAL_FZ_APP_TYPE=d
                ;;
    esac
}

___x_cmd_ccal___fzm_fz_(){
    {
        ___x_cmd_cmds awk \
            -v "year=$___X_CMD_CCAL_FZ_DATE_TODAY_Y"    \
            -v "month=$___X_CMD_CCAL_FZ_DATE_TODAY_M"   \
            -f "$___X_CMD_ROOT_MOD/ccal/lib/awk/fzm_ls.awk" \
            < "$___X_CMD_CCAL_LUNAR_INDEX_FOLDER/month.tsv"
    } | {
        FZF_DEFAULT_OPTS="
            --exact
            --ansi
            --reverse
            --height='80%'
            --bind='ctrl-w:toggle-preview-wrap'
            --bind='ctrl-r:change-preview-window(52|80%|hidden)'
            --bind='ctrl-t:print(|restart|)+accept'
            --bind='ctrl-b:print(|goback|)+accept'
            --bind='ctrl-f:accept'

            --bind='tab:print(|next-view|)+accept'
            --bind='shift-tab:print(|prev-view|)+accept'

            --bind='alt-up:up+up+up+up+up+up+up+up+up+up+up+up'
            --bind='alt-down:down+down+down+down+down+down+down+down+down+down+down+down'

            --preview-window='52,right,wrap'
            --bind='load:pos($cursor_pos)'
        " ___x_cmd fzf --preview="___x_cmdexe ccal --fzmpreview {1} $___X_CMD_CCAL_FZ_DATE_TODAY"
    }
}

___x_cmd_ccal___fzmpreview(){
    local ym="$1"
    local today_ym="$2"

    case "$today_ym" in
        "$ym")      ___x_cmd ccal info ;;
        *)          HLDAY="$ym-1" ___x_cmd ccal show "$ym"
    esac
}

___x_cmd_ccal_fz___ls(){
    local y=1900
    local m=1

    while [ $y -lt 2099 ]; do
        m=1
        while [ $m -le 12 ]; do
            if [ "$y" -lt "$___X_CMD_CCAL_FZ_DATE_TODAY_Y" ] || { [ "$y" -eq "$___X_CMD_CCAL_FZ_DATE_TODAY_Y" ] && [ "$m" -lt "$___X_CMD_CCAL_FZ_DATE_TODAY_M" ]; }; then
                printf "\033[0;2m"
            elif [ "$y" -eq "$___X_CMD_CCAL_FZ_DATE_TODAY_Y" ] && [ "$m" -eq "$___X_CMD_CCAL_FZ_DATE_TODAY_M" ]; then
                printf "\033[0m"
            else
                printf "\033[0m"
            fi
            printf "%04d" "$y"
            printf "\033[37m-"
            case "$m" in
                3|4|5)      printf "\033[32m" ;;
                6|7|8)      printf "\033[36m" ;;
                9|10|11)    printf "\033[33m" ;;
                12|1|2)     printf "\033[31m" ;;
            esac
            printf "%02d\n" "$m"
            m="$(( m+1 ))"
        done
        y="$(( y+1 ))"
    done
}

