# shellcheck shell=bash
# shellcheck disable=SC2005

function __() {
	echo "$@"
}

function __make_ansi() {
	next=$1
	shift
	echo "\[\e[$("__$next" "$@")m\]"
}

function __make_echo() {
	next=$1
	shift
	echo "\033[$("__$next" "$@")m"
}

function __reset() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "0${out:+;${out}}"
}

function __bold() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}1"
}

function __faint() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}2"
}

function __italic() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}3"
}

function __underline() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}4"
}

function __negative() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}7"
}

function __crossed() {
	next=$1
	shift
	out="$("__$next" "$@")"
	echo "${out:+${out};}8"
}

function __color_normal_fg() {
	echo "3$1"
}

function __color_normal_bg() {
	echo "4$1"
}

function __color_bright_fg() {
	echo "9$1"
}

function __color_bright_bg() {
	echo "10$1"
}

function __color_black() {
	echo "0"
}

function __color_red() {
	echo "1"
}

function __color_green() {
	echo "2"
}

function __color_yellow() {
	echo "3"
}

function __color_blue() {
	echo "4"
}

function __color_magenta() {
	echo "5"
}

function __color_cyan() {
	echo "6"
}

function __color_white() {
	echo "7"
}

function __color_rgb() {
	r=$1 && g=$2 && b=$3
	[[ $r == "$g" && $g == "$b" ]] && echo $((r / 11 + 232)) && return # gray range above 232
	echo "8;5;$(((r * 36 + b * 6 + g) / 51 + 16))"
}

function __color() {
	color="$1"
	shift
	case "$1" in
		fg | bg)
			side="$1"
			shift
			;;
		*) side="fg" ;;
	esac
	case "$1" in
		normal | bright)
			mode="$1"
			shift
			;;
		*) mode=normal ;;
	esac
	[[ $color == "rgb" ]] && rgb="$1 $2 $3"
	shift 3

	next=$1
	shift
	out="$("__$next" "$@")"
	echo "$("__color_${mode}_${side}" "$("__color_${color}" "$rgb")")${out:+;${out}}"
}

function __black() {
	echo "$(__color black "$@")"
}

function __red() {
	echo "$(__color red "$@")"
}

function __green() {
	echo "$(__color green "$@")"
}

function __yellow() {
	echo "$(__color yellow "$@")"
}

function __blue() {
	echo "$(__color blue "$@")"
}

function __magenta() {
	echo "$(__color magenta "$@")"
}

function __cyan() {
	echo "$(__color cyan "$@")"
}

function __white() {
	echo "$(__color white "$@")"
}

function __rgb() {
	echo "$(__color rgb "$@")"
}

function __color_parse() {
	next=$1
	shift
	echo "$("__$next" "$@")"
}

function color() {
	echo "$(__color_parse make_ansi "$@")"
}

function echo_color() {
	echo "$(__color_parse make_echo "$@")"
}
