#!/bin/bash


#######################################################################################################################
# Variables                                                                                                           #
#######################################################################################################################
# Arrays
declare -a ECP_WORK_DIR_PATH_SUBFOLDERS=("config data debug log media certificates profiling")
declare -a GRAPHICS_SUBFOLDERS=("custom-graphics promotion-screen-graphics")
declare -a CERTIFICATES_SUBFOLDERS=("cs_root delta-fm")
declare -a WEBUI_WORK_DIR_PATH_SUBFOLDERS=("cache database log rauc-work ssl work")

# Definitions
USER_XFC="xfc"
GROUP_XFC="xfc"
USER_WWW_DATA="www-data"
GROUP_WWW_DATA="www-data"
APPLICATION_PERMISSION="775"

# Messages
ENVIRONMENT_VARIABLE_MISSING="Please set Environment variables: \
ECP_WORK_FILES_DIR, \
WEBUI_WORK_FILES_DIR, \
ORIGIN_DATABASE_DIR, \
DATABASE_DIR."

#######################################################################################################################
# Functions                                                                                                           #
#######################################################################################################################

check_environment_variables()
{
    # Check if a path in DMS_WORK_FILES_DIR is given
    if [[ "$ECP_WORK_FILES_DIR" == "" || "$WEBUI_WORK_FILES_DIR" == "" || "$ORIGIN_DATABASE_DIR" == "" || "$DATABASE_DIR" == "" ]]; then
        
        # Check if a custom path is given
        echo "$ENVIRONMENT_VARIABLE_MISSING"
        exit
        
    fi
}

handle_work_dir()
{
    local parent_dir="$1"
    local expected_user="$2"
    local expected_group="$3"
    local expected_permission="$4"
    local subfolders="$5"
    
    # Check if workdir exists
    if [ ! -d "$parent_dir" ]; then
        mkdir "$parent_dir"
    fi
    
    # Check if sub folders exists
    for subfolder in $subfolders; do
        newpath="$parent_dir"/$subfolder
        
        if [ ! -d "$newpath" ]; then
            mkdir "$newpath" -p
        fi
        
    done
    
    # Check workdir user and group
    user=$(stat -c "%U" "$parent_dir")
    group=$(stat -c "%G" "$parent_dir")
    
    if [ "$user" != "$expected_user" ] || [ "$group" != "$expected_group" ]; then
        chown "$expected_user":"$expected_group" "$parent_dir"
    fi
    
    # Check sub folders user and group
    for subfolder in $subfolders; do
        newpath="$parent_dir"/$subfolder
        
        user=$(stat -c "%U" "$newpath")
        group=$(stat -c "%G" "$newpath")
        
        if [ "$user" != "$expected_user" ] || [ "$group" != "$expected_group" ]; then
            chown "$expected_user":"$expected_group" "$newpath"
        fi
    done
    
    # Check workdir permission
    permission=$(stat -c "%a" "$parent_dir")
    
    if [ "$permission" != "$expected_permission" ]; then
        chmod "$expected_permission" "$parent_dir"/
    fi
    
    # Check sub folders permission
    for subfolder in $subfolders; do
        newpath="$parent_dir"/$subfolder
        
        permission=$(stat -c "%a" "$newpath")
        
        if [ "$permission" != "$expected_permission" ]; then
            chmod "$expected_permission" "$newpath"/
        fi
    done
}

handle_uploads_dir()
{
    # Check if workdir exists
    if [ ! -d "$WEBUI_UPLOAD_FILES_DIR" ]; then
        mkdir "$WEBUI_UPLOAD_FILES_DIR"
    fi
    
    # Check user and group
    user=$(stat -c "%U" "$WEBUI_UPLOAD_FILES_DIR")
    group=$(stat -c "%G" "$WEBUI_UPLOAD_FILES_DIR")
    
    if [ "$user" != "$USER_XFC" ] || [ "$group" != "$GROUP_WWW_DATA" ]; then
        chown "$USER_XFC":"$GROUP_WWW_DATA" "$WEBUI_UPLOAD_FILES_DIR"
    fi
    
    # Check permission level
    permission=$(stat -c "%a" "$WEBUI_UPLOAD_FILES_DIR")
    
    if [ "$permission" != "$APPLICATION_PERMISSION" ]; then
        chmod "$APPLICATION_PERMISSION" "$WEBUI_UPLOAD_FILES_DIR"/
    fi
}

handle_ipk_dir()
{
    # Check if workdir exists
    if [ ! -d "$WEBUI_IPK_FILES_DIR" ]; then
        mkdir "$WEBUI_IPK_FILES_DIR"
    fi

    # Check user and group
    user=$(stat -c "%U" "$WEBUI_IPK_FILES_DIR")
    group=$(stat -c "%G" "$WEBUI_IPK_FILES_DIR")

    if [ "$user" != "$USER_XFC" ] || [ "$group" != "$GROUP_WWW_DATA" ]; then
        chown "$USER_XFC":"$GROUP_WWW_DATA" "$WEBUI_IPK_FILES_DIR"
    fi

    # Check permission level
    permission=$(stat -c "%a" "$WEBUI_IPK_FILES_DIR")

    if [ "$permission" != "$APPLICATION_PERMISSION" ]; then
        chmod "$APPLICATION_PERMISSION" "$WEBUI_IPK_FILES_DIR"/
    fi
}

change_folder_user_group_rauc()
{
    # rauc does change the ownership to root. After a restart or reboot www-data can access it again.
    chown -R $USER_WWW_DATA:$GROUP_WWW_DATA $WEBUI_WORK_FILES_DIR"/rauc-work" || true
}

check_database()
{
    # Check if workdir exists
    if [ ! -f "$DATABASE_DIR" ]; then
        cp "$ORIGIN_DATABASE_DIR" "$DATABASE_DIR"
        chown $USER_WWW_DATA:$GROUP_WWW_DATA "$DATABASE_DIR"
    fi
}

#######################################################################################################################
# Main entry                                                                                                          #
#######################################################################################################################

check_environment_variables

handle_work_dir $ECP_WORK_FILES_DIR $USER_XFC $GROUP_XFC $APPLICATION_PERMISSION "${ECP_WORK_DIR_PATH_SUBFOLDERS[@]}"
handle_work_dir $ECP_WORK_FILES_DIR/media $USER_XFC $GROUP_XFC $APPLICATION_PERMISSION "${GRAPHICS_SUBFOLDERS[@]}"
handle_work_dir $ECP_WORK_FILES_DIR/certificates $USER_XFC $GROUP_XFC $APPLICATION_PERMISSION "${CERTIFICATES_SUBFOLDERS[@]}"
handle_work_dir $WEBUI_WORK_FILES_DIR $USER_WWW_DATA $GROUP_WWW_DATA $APPLICATION_PERMISSION "${WEBUI_WORK_DIR_PATH_SUBFOLDERS[@]}"

handle_uploads_dir
handle_ipk_dir

change_folder_user_group_rauc

check_database

# Start the webui restAPI as www-data
exec sudo -u "$USER_WWW_DATA" -g "$GROUP_WWW_DATA" python3 -m uvicorn server.main:app --host "$HOST" --port "$PORT" --log-config uvicorn-logging-conf.json
