#!/bin/bash

#================================================================================
# Инициализация
#================================================================================

# Определяем местоположение скрипта
SCRIPT_PATH=$(dirname "$(readlink -f "$0")")
# Импортируем общие функции
source $SCRIPT_PATH/console_colors
source $SCRIPT_PATH/super_user_check
source $SCRIPT_PATH/errors_func
source $SCRIPT_PATH/simcontrol-constans
source $SCRIPT_PATH/simcontrol-dbus-functions

# Проверяем права суперпользователя
check_root_rights

# Получаем задаваемый режим
mode=$(echo $1 | tr '[:lower:]' '[:upper:]')
# Зададим значение
# Для MODE_OFF MODE_ON $MODE_STATUS: Пустое значение
# Для MODE_SET_MODE: 0 или 1 (WORK_MODE_BLACKLIST или WORK_MODE_WHITELIST)
# Для MODE_ADD и MODE_REMOVE: SIMNAME1:SIMICCID1 (Можно без имени)
value=$2

#================================================================================
# Константы
#================================================================================
# Режимы управления
declare SIM_MODE_HELP='HELP'
declare SIM_MODE_ON='ON'
declare SIM_MODE_OFF='OFF'
declare SIM_MODE_SET_MODE='SETMODE'
declare SIM_MODE_ADD='ADD'
declare SIM_MODE_DELETE='DELETE'
declare SIM_MODE_STATUS='STATUS'

function modeText() {
    local MODE="$1"
    local ModeText='UNKNOWN'

    if [ $MODE == $WORK_MODE_BLACKLIST ]; then
        ModeText='BLACK LIST'
    elif [ $MODE == $WORK_MODE_WHITELIST ]; then
        ModeText='WHITE LIST'
    fi

    echo "$ModeText"
}

#================================================================================
# Функции
#================================================================================
## startChanges
## @brief - Функция, выполняемая перед внесением изменений
function startChanges() {
    echo -e "${PROCESS_TEXT} Changes appling..."
}

## checkSuccess
## @brief - Функция проверит успешность внесённых изменений
## @param $1 - Результат внесения изменений
function checkSuccess() {
    local VAL=$1

    if [ $VAL -eq 0 ]; then
        echo -e "${INFO_TEXT} If mobile data transfer is not available when unlocking the SIM card, restart the device and activate \"mobile data\" in the quick access panel."
    fi
}

## checkSimIccid
## @brief - Функция проверит корректность ICCID сим-карты
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт признак корректности ICCID сим-карты
function checkSimIccid() {
    local SIM_VAR="$1"

    local isCorrect=true
    local iccid=""

    if [[ $SIM_VAR == *":"* ]]; then
        iccid=${SIM_VAR#*:}
    else
        iccid="$SIM_VAR"
    fi

    # ICCID должен содержать от 18 до 22 символов
    if  [[ ${#iccid} < 18 || ${#iccid} > 22 ]]; then
        isCorrect=fasle
    fi
    # ICCID должен быть числом
    if ! [[ $iccid =~ ^[0-9]+$ ]] ; then
        isCorrect=fasle
    fi

    # Вернём корректность ICCID
    [[ $isCorrect == true ]]
}

## checkSimName
## @brief - Функция проверит корректность имени сим-карты
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт признак корректности имени сим-карты
function checkSimName() {
    local SIM_VAR="$1"

    local isCorrect=true
    local name=""

    if [[ $SIM_VAR == *":"* ]]; then
        name=${SIM_VAR%:*}
    fi

    # Имя не должно содержать символов : и ;
    if ! [[ $name =~ ^[^:\;]*$ ]] ; then
        isCorrect=fasle
    fi

    # Вернём корректность имени
    [[ $isCorrect == true ]]
}

## correctSimFormat
## @brief - Функция скорректирует формат сим-карты
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт скорректированный формат сим-карты
function correctSimFormat() {
    local SIM_VAR="$1"

    local name=""
    local iccid=""

    if [[ $SIM_VAR == *":"* ]]; then
        name=${SIM_VAR%:*}
        iccid=${SIM_VAR#*:}
    else
        iccid="$SIM_VAR"
    fi

    # Имя может быть пустым
    if [[ -z $name ]]; then
        # Мы его сгенерируем
        name="Sim_$(date '+%s%N')"
    fi
    # В имени не должно быть пробелов
    name=$(echo "$name" | tr ' ' '_' )
    # Если имя длиннее 22 то мы его обрежем
    if  [[ ${#name} > 22 ]]; then
        name=$(echo "$name" | head -n 1 | cut -c -22)
    fi

    # Вернём скорректированный формат
    echo "$name:$iccid"
}

## checkSimInList
## @brief - Функция проверит наличие сим карты в списке
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт признак наличия сим карты в списке
function checkSimInList() {
    local SIM="$1"
    local ICCID_LIST=( $(echo $(simControlGetSimList) | sed "s/ /\n/g" | awk -F ':' '{print $2}') )

    local simIccid=${SIM#*:}
    local alreadyInList=false

    for ICCID in ${ICCID_LIST[@]}
    do
        if [[ $ICCID == $simIccid ]]; then
            alreadyInList=true
            break
        fi
    done

    # Вернём корректность строки
    [[ $alreadyInList == true ]]
}

## setActive
## @brief - Функция задаст активность контроля сим-карт
## @param $1 - Признак активности
## @return Вернёт код успешности операции
function setActive() {
    local ACTIVE="$1"
    local result=0

    startChanges
    simControlSetActive "$ACTIVE"

    result=$?
    checkSuccess $result

    return $result
}


## setMode
## @brief - Функция задаст режим работы контроля сим-карт
## @param $1 - Код режима работы
## @return Вернёт код успешности операции
function setMode() {
    local MODE="$1"
    local result=0

    startChanges
    simControlSetMode "$MODE"

    result=$?
    checkSuccess $result

    return $result
}

## addSim
## @brief - Функция добавит сим-карту в список
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт код успешности операции
function addSim() {
    local SIM="$1"
    local result=0

    startChanges

    if ! $(checkSimInList "$SIM"); then
        local simName=${SIM%:*}
        local simIccid=${SIM#*:}
        if [ -z "$simIccid" ]; then simIccid="$SIM"; fi

        simControlAddSim "$simName" "$simIccid"
        result=$?
    fi

    checkSuccess $result
    return $result
}

## removeSim
## @brief - Функция удалит сим-карту из списка
## @param $1 - Сим карта в формате SIMNAME:SIMICCID
## @return Вернёт код успешности операции
function removeSim {
    local SIM="$1"
    local result=0

    startChanges

    if $(checkSimInList "$SIM"); then
        local simIccid=${SIM#*:}
        if [ -z "$simIccid" ]; then simIccid="$SIM"; fi

        simControlDeleteSim "$simIccid"
        result=$?
    fi

    checkSuccess $result
    return $result
}

## simcontrolApplay
## @brief - Функция применит список сим-карт как чёрный или белый список либо деактивирует его
## @return Вернёт код успешности операции
# function simcontrolApplay() {
#     local result=0
#
#     echo -e "${PROCESS_TEXT} Changes appling..."
#
#     simControApplay
#     result=$?
#
#     if [ $result -eq 0 ]; then
#         echo -e "${INFO_TEXT} If mobile data transfer is not available when unlocking the SIM card, restart the device and activate \"mobile data\" in the quick access panel."
#     fi
#
#     return $result
# }

#================================================================================
# main
#================================================================================
globalResult=0

if [[ $mode == $SIM_MODE_HELP ]]; then
    # help
    echo "============================================================"
    echo "Simcontrol deactivation example:"
    echo "# $(basename $0) $SIM_MODE_OFF"
    echo ""
    echo "Simcontrol activation example:"
    echo "# $(basename $0) $SIM_MODE_ON"
    echo ""
    echo "Switch mode example:"
    echo "# $(basename $0) $SIM_MODE_SET_MODE {$WORK_MODE_BLACKLIST | $WORK_MODE_WHITELIST}"
    echo "Where:"
    echo "'$SIM_MODE_SET_MODE' is the switch mode command"
    echo "{$WORK_MODE_BLACKLIST | $WORK_MODE_WHITELIST} is the mode code"
    echo "Possible mode values:"
    echo "$(modeText $WORK_MODE_BLACKLIST): $WORK_MODE_BLACKLIST"
    echo "$(modeText $WORK_MODE_WHITELIST): $WORK_MODE_WHITELIST"
    echo ""
    echo "Sim remove from list example:"
    echo "# $(basename $0) $SIM_MODE_DELETE simname:12345678901234567890"
    echo "Where:"
    echo "'$SIM_MODE_DELETE' is the remove sim command"
    echo "'simname:' is the sim card name (Must not contain characters ';' ':' ) [1-40 symbols] 'Optional parameter'"
    echo "':' is the data seporator"
    echo "'12345678901234567890' is the sim card ICCID [1-22 numbers]"
    echo ""
    echo "Sim add to list example:"
    echo "# $(basename $0) $SIM_MODE_ADD simname:12345678901234567890"
    echo "Where:"
    echo "'$SIM_MODE_ADD' is the add sim command"
    echo "'simname:' is the sim card name (Must not contain characters ';' ':' ) [1-40 symbols] 'Optional parameter'"
    echo "':' is the data seporator"
    echo "'12345678901234567890' is the sim card ICCID [1-22 numbers]"
    echo ""
    echo "Simcontrol show status example:"
    echo "# $(basename $0) $SIM_MODE_STATUS"
    echo ""
    echo "Show this help:"
    echo "$(basename $0) $SIM_MODE_HELP"
    echo "============================================================"
else

    if [[ $mode == $SIM_MODE_OFF ]]; then

        echo -e "${PROCESS_TEXT} Deactivation..."
        setActive 'false'
        globalResult=$?

    elif [[ $mode == $SIM_MODE_ON ]]; then

        echo -e "${PROCESS_TEXT} Activation..."
        setActive 'true'
        globalResult=$?

    elif [[ $mode == $SIM_MODE_SET_MODE ]]; then

        if [[ "$value" != @($WORK_MODE_BLACKLIST|$WORK_MODE_WHITELIST) ]]; then
            echoerr "${ERROR_TEXT} Unknow mode value: $value"
            globalResult=1
        else
            echo -e "${PROCESS_TEXT} Switching on $(modeText $value)..."
            setMode "$value"
            globalResult=$?
        fi

    elif [[ $mode == $SIM_MODE_ADD ]]; then

        if ! $(checkSimIccid "$value") || ! $(checkSimName "$value"); then
            echoerr "${ERROR_TEXT} Incorrect sim format: $value"
            globalResult=1
        else
            echo -e "${PROCESS_TEXT} Sim card in the process of adding..."
            addSim $(correctSimFormat "$value")
            globalResult=$?
        fi

    elif [[ $mode == $SIM_MODE_DELETE ]]; then

        if ! $(checkSimIccid "$value") || ! $(checkSimName "$value"); then
            echoerr "${ERROR_TEXT} Incorrect sim format: $value"
            globalResult=1
        else
            echo -e "${PROCESS_TEXT} SIM card in the process of being removed..."
            removeSim $(correctSimFormat "$value")
            globalResult=$?
        fi

    elif [[ $mode == $SIM_MODE_STATUS ]]; then

        if [ $(simControlGetActive) == 'false' ]; then echo -e "ACTIVE: ${Red}OFF${Color_Off}"; else echo -e "ACTIVE: ${Green}ON${Color_Off}"; fi

        echo "MODE: $(modeText $(simControlGetMode))"

        echo "LIST:"
        SimList=( $(simControlGetSimList) )

        for Item in ${SimList[@]}
        do
            simname=${Item%:*}
            simiccid=${Item#*:}

            echo "NAME: $simname ICCID: $simiccid"
        done

        globalResult=0
    else
        echoerr "${ERROR_TEXT} Unknow mode: $mode"
        globalResult=1
    fi
fi

if [[ $mode != @($SIM_MODE_HELP|$SIM_MODE_STATUS) ]]; then
    if [ $globalResult -eq 0 ]; then echo -e "${STATUS_TEXT} Success"; else echoerr "${ERROR_TEXT} An error has occurred! Code: $globalResult"; fi
fi

exit $globalResult
#================================================================================
