#!/bin/bash

KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps
DEFAULT_SYSFONT=LatArCyrHeb-16
I18N_CONF="${initdir}/etc/sysconfig/i18n"
KEYBOARD_CONF="${initdir}/etc/sysconfig/keyboard"


# This is from 10redhat-i18n.
findkeymap () {
    local MAP=$1
    [[ ! -f $MAP ]] && \
    MAP=$(find ${kbddir}/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1)
    [[ " $KEYMAPS " = *" $MAP "* ]] && return
    KEYMAPS="$KEYMAPS $MAP"
    case $MAP in
        *.gz) cmd=zgrep;;
        *.bz2) cmd=bzgrep;;
        *) cmd=grep ;;
    esac

    for INCL in $($cmd "^include " $MAP | cut -d' ' -f2 | tr -d '"'); do
        for FN in $(find ${kbddir}/keymaps -type f -name $INCL\*); do
            findkeymap $FN
        done
    done
}

# Function gathers variables from distributed files among the tree, maps to
# specified names and prints the result in format "new-name=value".
#
# $@ = list in format specified below (BNF notation)
#
# <list> ::= <element> | <element> " " <list>
# <element> ::= <conf-file-name> ":" <map-list>
# <map-list> ::= <mapping> | <mapping> "," <map-list>
# <mapping> ::= <src-var> "-" <dst-var> | <src-var>
#
# We assume no whitespace are allowed between symbols.
# <conf-file-name> is a file holding <src-var> in your system.
# <src-var> is a variable holding value of meaning the same as <dst-var>.
# <dst-var> is a variable which will be set up inside initramfs.
# If <dst-var> has the same name as <src-var> we can omit <dst-var>.
#
# Example:
# /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <list> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <element> = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS
# <conf-file-name> = /etc/conf.d/keymaps
# <map-list> = KEYMAP,extended_keymaps-EXT_KEYMAPS
# <mapping> = KEYMAP
# <src-var> = KEYMAP
# <mapping> = extended_keymaps-EXT_KEYMAPS
# <src-var> = extended_keymaps
# <dst-var> = EXT_KEYMAPS
gather_vars() {
    local item map value

    for item in $@
    do
        item=(${item/:/ })
        for map in ${item[1]//,/ }
        do
            map=(${map//-/ })
            value=$(grep "^${map[0]}=" "${item[0]}")
            value=${value#*=}
            echo "${map[1]:-${map[0]}}=${value}"
        done
    done
}

install_base() {
    dracut_install setfont loadkeys kbd_mode stty
    inst ${moddir}/console_init /lib/udev/console_init
    inst_rules ${moddir}/10-console.rules
    inst_hook cmdline 20 "${moddir}/parse-i18n.sh"
}

install_all_kbd() {
    local rel f

    for f in $(eval find ${kbddir}/{${KBDSUBDIRS}} -type f -print)
    do
        inst $f
    done

    # remove unnecessary files
    rm -f "${initdir}${kbddir}/consoletrans/utflist"
    find "${initdir}${kbddir}/" -name README\* -delete

    dracut_install gzip bzip2
}

install_local_keyboard() {
    local map

    eval $(gather_vars ${keyboard_vars})

    # Gentoo user may have KEYMAP set to something like "-u pl2",
    KEYMAP=${KEYMAP#-* }
    # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE.  They were in
    # original redhat-i18n module.  Anyway it won't hurt.
    EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE}

    [[ ${KEYMAP} ]] || derror 'No KEYMAP.' || return 1
    findkeymap ${KEYMAP}

    for map in ${EXT_KEYMAPS}
    do
        dinfo "Adding extra map: ${map}"
        findkeymap ${map}
    done

    inst_opt_decompress ${KEYMAPS}

    mksubdirs ${KEYBOARD_CONF}
    print_vars KEYMAP EXT_KEYMAPS >> ${KEYBOARD_CONF}
}

install_local_i18n() {
    eval $(gather_vars ${i18n_vars})

    [[ ${SYSFONT} ]] || SYSFONT=${DEFAULT_SYSFONT}
    SYSFONT=${SYSFONT%.psf*}
    inst_opt_decompress ${kbddir}/consolefonts/${SYSFONT}.*

    if [[ ${CONTRANS} ]]
    then
        CONTRANS=${CONTRANS%.trans}
        inst ${kbddir}/consoletrans/${CONTRANS}.trans
    fi

    if [[ ${UNIMAP} ]]
    then
        UNIMAP=${UNIMAP%.uni}
        inst ${kbddir}/unimaps/${UNIMAP}.uni
    fi

    if [[ ${UNICODE} ]]
    then
        if [[ ${UNICODE^^} = YES || ${UNICODE} = 1 ]]
        then
            UNICODE=1
        elif [[ ${UNICODE^^} = NO || ${UNICODE} = 0 ]]
        then
            UNICODE=0
        else
            UNICODE=''
        fi
    fi
    if [[ ! ${UNICODE} && ${LANG^^} =~ .*\.UTF-?8 ]]
    then
        UNICODE=1
    fi

    mksubdirs ${I18N_CONF}
    print_vars LC_ALL LANG UNICODE SYSFONT CONTRANS UNIMAP >> ${I18N_CONF}
}

checks() {
    for kbddir in ${kbddir} /usr/lib/kbd /lib/kbd /usr/share
    do
        [[ -d "${kbddir}" ]] && \
        for dir in ${KBDSUBDIRS//,/ }
        do
            [[ -d "${kbddir}/${dir}" ]] && continue
            false
        done && break
	kbddir='' 
    done

    [[ ${kbddir} ]] || {
        derror "Directories ${KBDSUBDIRS//,/, } not found.  Please inform us about the issue including your OS name and version."
        return 1
    }

    [[ ! ${hostonly} || ${keyboard_vars} && ${i18n_vars} ]] || {
        derror 'Please set up keyboard_vars and i18n_vars in configuration file.'
        return 1
    }
}


if checks
then
    install_base

    if [[ ${hostonly} ]]
    then
        install_local_keyboard
        install_local_i18n
    else
        install_all_kbd
    fi
fi
