#!/usr/bin/env bash
#
#   Script name: ubdistconv
#   Description: Script for convert os_release
#   GitLab: https://gitlab.ublinux.ru/
#   Author: Dmitry Razumov <asmeron@ublinux.com>
#   Contributors: UBGroup support <support@ublinux.com>
#
#   Copyright (c) 2021-2025 UBLinux Development Team <support@ublinux.com>
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program.  If not, see <http://www.gnu.org/licenses/>.

VERSION_SCRIPT=2.18

# Exit Immediately if a command fails
#set -o errexit

#######################################
###   :::   F U N C T I O N S   :::   #
#######################################

usage() {
    printf "%s  %s\n" "${0##*/}" "version: ${VERSION_SCRIPT}"
    cat <<EOF
Convert os_release UBLinux

Usage: ${0##*/} [OPTIONS...] [TEXT]
  If the TEXT is not set, then take the OS_RELEASE_PRETTY_NAME of the current system

Meta Commands:
  help          	Show this help

OPTIONS:
  -n, --name		Get name from OS_RELEASE_PRETTY_NAME
  -v, --version		Get version from OS_RELEASE_PRETTY_NAME
  -c, --category	Get category from OS_RELEASE_PRETTY_NAME
  -a, --arch		Get achitecture from OS_RELEASE_PRETTY_NAME
  -d, --codename	Get codename from OS_RELEASE_PRETTY_NAME
  -p, --plymouththeme   Get plymouth theme from OS_RELEASE_PRETTY_NAME
  -s, --vername		Get version name file from OS_RELEASE_PRETTY_NAME
  -o, --osrelease	Get 'os-release' from OS_RELEASE_PRETTY_NAME
  -l, --lsbrelease	Get 'lsb-release' from OS_RELEASE_PRETTY_NAME
  -h, --help		Show this help
  -V, --version		Show package version


OPTIONS update:
Examples:
${0##*/} -d
${0##*/} -c "UBLinux 2109 Desktop Basic (x86_64)"
${0##*/} -p "ublinux_db"
EOF
    exit 0
}

arguments() {
# Pre-process options to:
# - expand -xyz into -x -y -z
# - expand --longopt=arg into --longopt arg
    local ARGV=()
    local END_OF_OPT=
    while [[ $# -gt 0 ]]; do
	arg="$1"; shift
	case "${END_OF_OPT}${arg}" in
	    --) ARGV+=("$arg"); END_OF_OPT=1 ;;
	    --*=*)ARGV+=("${arg%%=*}" "${arg#*=}") ;;
	    --*) ARGV+=("$arg") ;;
	    -*) for i in $(seq 2 ${#arg}); do ARGV+=("-${arg:i-1:1}"); done ;;
	    *) ARGV+=("$arg") ;;
	esac
    done
# Apply pre-processed options
    set -- "${ARGV[@]}"
# Parse options
    local END_OF_OPT=
    local POSITIONAL_ARGS=()
    [[ -z $@ ]] && usage && exit 0
    while [[ $# -gt 0 ]]; do
	case "${END_OF_OPT}${1}" in
	    -h | --help | help)	usage ;;
	    -n | --name)	NAME=1 ;;
	    -v | --version)    	VERSION=1 ;;
	    -c | --category)   	CATEGORY=1 ;;
	    -a | --arch)	ARCH=1 ;;
	    -d | --codename)    CODENAME=1 ;;
	    -p | --plymouththeme) PLYMOUTH_THEME=1 ;;
	    -s | --vername)	VERNAME=1 ;;
	    -o | --osrelease)	OSRELEASE=1 ;;
	    -l | --lsbrelease)  LSBRELEASE=1 ;;
	    -V | --version)	echo "Version: ${VERSION_SCRIPT}"; exit 0 ;;
	    --stdin)        	READ_STDIN=1 ;;
	    --)             	END_OF_OPT=1 ;;
	    -*|--*)         	echo "WARNING: Unrecognized argument, skiped: $1" >&2  ;;
	    *)              	POSITIONAL_ARGS+=("$1") ;;
	esac
	shift
    done
# Restore positional parameters
    set -- "${POSITIONAL_ARGS[@]}"
    [[ -f ${POSITIONAL_ARGS[@]} ]] && ARGS=$(cat ${POSITIONAL_ARGS[@]} | head -1) \
	|| ARGS="${POSITIONAL_ARGS[@]}"

    [[ -n ${ARGS} ]] || ARGS=$(cat /usr/lib/os-release | grep "PRETTY_NAME=" | cut -d= -f2 | tr -d \")
    [[ -n ${ARGS} ]] || ARGS=$(find /memory/layer-base/ -maxdepth 2 -type f -name "VERSION*" -exec head -1 {} \; 2>/dev/null | tail -1)
    [[ -n ${ARGS} ]] || ARGS=$(find / -maxdepth 1 -type f -name "VERSION*" -exec head -1 {} \; 2>/dev/null | tail -1)
    [[ -n ${ARGS} ]] || ARGS="UBLinux 0000 Unknown (x)"
}

detect_from_category() {
    local DISTRIB_CODENAME=$1
    case "${DISTRIB_CODENAME}" in
	"ublinux_db") 
	    DISTRIB_CATEGORY="Desktop Basic" 
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse"
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_DB" ;;
    	"ublinux_de") 
	    DISTRIB_CATEGORY="Desktop Enterprise" 
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_DE" ;;
	"ublinux_edu") 
	    DISTRIB_CATEGORY="Desktop Education"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_EDU" ;;
	"ublinux_srv") 
	    DISTRIB_CATEGORY="Server"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_SRV" ;;
	"ublinux_embedded") 
	    DISTRIB_CATEGORY="Embedded"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
    	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_EMBD" ;;
	"ublinux_de_adara") 
	    DISTRIB_CATEGORY="Desktop Enterprise Adara"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_DE_ADARA" ;;
	"ublinux_srv_adara") 
	    DISTRIB_CATEGORY="Server Adara"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_SRC_ADARA" ;;
	"ublinux_de_sibsutis") 
	    DISTRIB_CATEGORY="Desktop Enterprise SibSUTIS"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round-sibsutis"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse-sibsutis" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_DE_SIBSUTIS" ;;
	"ublinux_edu_sibsutis") 
	    DISTRIB_CATEGORY="Desktop Education SibSUTIS"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round-sibsutis"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse-sibsutis" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_EDU_SIBSUTIS" ;;
	"ublinux_srv_sibsutis") 
	    DISTRIB_CATEGORY="Server SibSUTIS"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round-sibsutis"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse-sibsutis" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_SRV_SIBSUTIS" ;;
	"ublinux_kernel") 
	    DISTRIB_CATEGORY="Kernel"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
    	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_KERNEL" ;;
	"ublinux_liveoffice") 
	    DISTRIB_CATEGORY="LiveOffice"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round-liveoffice"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse-liveoffice" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_LIVEOFFICE" ;;
	"ublinux_unknown") 
	    DISTRIB_CATEGORY="Unknown"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_UNKNOWN" ;;
	*) 
	    DISTRIB_CATEGORY="Unknown"
	    PLYMOUTH_THEME_POWERON="ublinux-logo-round"; PLYMOUTH_THEME_POWEROFF="ublinux-logo-pulse" 
	    FILE_VERNAME="VERSION_${DISTRIB_VERSION}_UNKNOWN" ;;
    esac
}

detect_from_pretty() {
        OS_RELEASE_PRETTY_NAME="$1"
	DISTRIB_NAME="$(echo "${OS_RELEASE_PRETTY_NAME}" | cut -d" " -f1)"
	DISTRIB_VERSION="$(echo "${OS_RELEASE_PRETTY_NAME}" | cut -d" " -f2)"
	DISTRIB_CATEGORY="$(echo "${OS_RELEASE_PRETTY_NAME}" | cut -d"(" -f1 | cut -d" " -f3- | xargs)"
	DISTRIB_ARCH="$(echo "${OS_RELEASE_PRETTY_NAME}" | cut -d'(' -f2 | cut -d')' -f1)"
	#DISTRIB_BUILD=`date +"%Y.%m.%d"`
	case "${DISTRIB_CATEGORY}" in
	    "Desktop Basic") DISTRIB_CODENAME="ublinux_db" ;;
	    "Desktop Enterprise") DISTRIB_CODENAME="ublinux_de" ;;
	    "Desktop Education") DISTRIB_CODENAME="ublinux_edu" ;;
	    "Server") DISTRIB_CODENAME="ublinux_srv" ;;
	    "Embedded") DISTRIB_CODENAME="ublinux_embedded" ;;
	    "Desktop Enterprise Adara") DISTRIB_CODENAME="ublinux_de_adara" ;;
	    "Server Adara") DISTRIB_CODENAME="ublinux_srv_adara" ;;
	    "Desktop Enterprise SibSUTIS") DISTRIB_CODENAME="ublinux_de_sibsutis" ;;
	    "Desktop Education SibSUTIS") DISTRIB_CODENAME="ublinux_edu_sibsutis" ;;
	    "Server SibSUTIS") DISTRIB_CODENAME="ublinux_srv_sibsutis" ;;
	    "Kernel") DISTRIB_CODENAME="ublinux_kernel" ;;
	    "LiveOffice") DISTRIB_CODENAME="ublinux_liveoffice" ;;
	    "Unknown") DISTRIB_CODENAME="ublinux_unknown" ;;
	    *) DISTRIB_CODENAME="ublinux_unknown" ;;
	esac
}

make_osrelease() {
########################################
#	file /usr/lib/os-release
#	https://gist.github.com/natefoo/814c5bf936922dad97ff
#	https://www.linux.org/docs/man5/os-release.html
########################################
    OS_RELEASE_NAME="${DISTRIB_NAME}"
    OS_RELEASE_VERSION="${DISTRIB_VERSION} ${DISTRIB_CATEGORY}"
    OS_RELEASE_VERSION_ID=${DISTRIB_VERSION}
    OS_RELEASE_VERSION_CODENAME=${DISTRIB_CODENAME}
    OS_RELEASE_PRETTY_NAME="${OS_RELEASE_NAME} ${DISTRIB_VERSION} ${DISTRIB_CATEGORY} (${DISTRIB_ARCH})"
    OS_RELEASE_ID="${DISTRIB_NAME,,}"
    OS_RELEASE_ID_LIKE=archlinux
    OS_RELEASE_ANSI_COLOR="0;36"
    OS_RELEASE_CPE_NAME="cpe:/o:ublinux:ublinux:${DISTRIB_VERSION}"
    OS_RELEASE_HOME_URL="https://www.ublinux.ru/"
    OS_RELEASE_DOCUMENTATION_URL="https://wiki.ublinux.ru/"
    OS_RELEASE_SUPPORT_URL="https://bbs.ublinux.ru/"
    OS_RELEASE_BUG_REPORT_URL="https://bugs.ublinux.ru/"
#OS_RELEASE_BUILD_ID=${DISTRIB_BUILD}
    OS_RELEASE_VARIANT=${DISTRIB_CATEGORY}
    OS_RELEASE_VARIANT_ID=${DISTRIB_CATEGORY%% *}
    OS_RELEASE_LOGO=ublinux
    OS_RELEASE=$(cat <<EOF
NAME="${OS_RELEASE_NAME}"
VERSION="${OS_RELEASE_VERSION}"
VERSION_ID=${OS_RELEASE_VERSION_ID}
VERSION_CODENAME=${OS_RELEASE_VERSION_CODENAME}
PRETTY_NAME="${OS_RELEASE_PRETTY_NAME}"
ID=${OS_RELEASE_ID}
ID_LIKE=${OS_RELEASE_ID_LIKE}
ANSI_COLOR="${OS_RELEASE_ANSI_COLOR}"
CPE_NAME="${OS_RELEASE_CPE_NAME}"
HOME_URL="${OS_RELEASE_HOME_URL}"
DOCUMENTATION_URL="${OS_RELEASE_DOCUMENTATION_URL}"
SUPPORT_URL="${OS_RELEASE_SUPPORT_URL}"
BUG_REPORT_URL="${OS_RELEASE_BUG_REPORT_URL}"
VARIANT="${OS_RELEASE_VARIANT}"
VARIANT_ID="${OS_RELEASE_VARIANT_ID,,}"
LOGO=${OS_RELEASE_LOGO}
EOF
)
}

make_lsbrelease() {
########################################
#	file /etc/lsb-release
########################################
    LSB_RELEASE_LSB_VERSION=4.0
    LSB_RELEASE_DISTRIB_ID="${DISTRIB_NAME}"
    LSB_RELEASE_DISTRIB_RELEASE=${DISTRIB_VERSION}
    LSB_RELEASE_DISTRIB_DESCRIPTION="${OS_RELEASE_PRETTY_NAME}"
    LSB_RELEASE_DISTRIB_CODENAME=${DISTRIB_CODENAME}
    LSB_RELEASE=$(cat <<EOF
LSB_VERSION=${LSB_RELEASE_LSB_VERSION}
DISTRIB_ID=${LSB_RELEASE_DISTRIB_ID}
DISTRIB_RELEASE=${LSB_RELEASE_DISTRIB_RELEASE}
DISTRIB_DESCRIPTION="${LSB_RELEASE_DISTRIB_DESCRIPTION}"
DISTRIB_CODENAME=${LSB_RELEASE_DISTRIB_CODENAME}
EOF
)
}

###############################
###   :::   M A I N   :::   ###
###############################

    PKGNAME=${0##*/}
    PATH_WORK=${PWD}

    arguments $@

    if [[ ${ARGS} =~ ^"ublinux_"[a-z]+ ]]; then 
	[[ -n ${DISTRIB_VERSION} ]] || DISTRIB_VERSION=$(/usr/lib/ubboot/ubdistconv -v)
	detect_from_category "${ARGS}"
	[[ -z ${CATEGORY} ]] || echo "${DISTRIB_CATEGORY}"
	[[ -z ${PLYMOUTH_THEME} ]] || { echo "${PLYMOUTH_THEME_POWERON}"; echo "${PLYMOUTH_THEME_POWEROFF}"; }
	[[ -z ${VERNAME} ]] || echo "${FILE_VERNAME}"
	[[ -z ${CATEGORY} ]] && [[ -z ${PLYMOUTH_THEME} ]] && [[ -z ${VERNAME} ]] && exit 1 || true
    elif [[ ${ARGS} =~ ^([[:alpha:]]+)' '([[:digit:].-]+)' '([[:alpha:] ]*)' ('(.*)')'$ ]]; then
	detect_from_pretty "${ARGS}"
	detect_from_category "${DISTRIB_CODENAME}"
	[[ -z ${NAME} ]] || echo "${DISTRIB_NAME}"
	[[ -z ${VERSION} ]] || echo "${DISTRIB_VERSION}"
	[[ -z ${CATEGORY} ]] || echo "${DISTRIB_CATEGORY}"
	[[ -z ${ARCH} ]] || echo "${DISTRIB_ARCH}"
	[[ -z ${CODENAME} ]] || echo "${DISTRIB_CODENAME}"
	[[ -z ${VERNAME} ]] || echo "${FILE_VERNAME}"
	[[ -z ${PLYMOUTH_THEME} ]] || { echo "${PLYMOUTH_THEME_POWERON}"; echo "${PLYMOUTH_THEME_POWEROFF}"; }
	[[ -z ${OSRELEASE} ]] || { make_osrelease; echo "${OS_RELEASE}"; }
	[[ -z ${LSBRELEASE} ]] || { make_lsbrelease; echo "${LSB_RELEASE}"; }
	[[ -z ${NAME} ]] && [[ -z ${VERSION} ]] && [[ -z ${CATEGORY} ]] && [[ -z ${ARCH} ]] && [[ -z ${CODENAME} ]] \
	&& [[ -z ${VERNAME} ]] && [[ -z ${PLYMOUTH_THEME} ]] && [[ -z ${OSRELEASE} ]] && [[ -z ${LSBRELEASE} ]] && exit 1 || true
    else
	exit 1
    fi
