#!/usr/bin/env bash

# ==========================================================
# KYGnus Web File Manager
# RPM Package Builder
#
# Project:
#   WebBase-FileManager
#
# Package:
#   KYGnus-file-manager
#
# Version:
#   1.0.1
#
# Architecture:
#   x86_64
#
# Supports:
#   - openSUSE / RPM distributions
#   - systemd
#   - runit
#   - SysVinit / manual fallback
#
# Build:
#   chmod +x build-rpm
#   ./build-rpm
#
# Output:
#   dist/KYGnus-file-manager-1.0.1-1.x86_64.rpm
#
# ==========================================================

set -Eeuo pipefail


# ==========================================================
# FORCE BASH
# ==========================================================

if [[ -z "${BASH_VERSION:-}" ]]; then

    echo "ERROR: This script must be executed with Bash."
    echo
    echo "Run:"
    echo "  bash ./build-rpm"
    exit 1

fi


# ==========================================================
# CONFIGURATION
# ==========================================================

APP_NAME="KYGnus-file-manager"
VERSION="1.0.1"
RELEASE="1"
ARCH="x86_64"

PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

BUILD_DIR="${PROJECT_DIR}/rpm_package"

RPM_TOPDIR="${BUILD_DIR}/rpmbuild"

SOURCES_DIR="${RPM_TOPDIR}/SOURCES"
SPECS_DIR="${RPM_TOPDIR}/SPECS"
BUILDROOT_DIR="${RPM_TOPDIR}/BUILDROOT"
BUILD_DIR_RPM="${RPM_TOPDIR}/BUILD"
RPMS_DIR="${RPM_TOPDIR}/RPMS"
SRPMS_DIR="${RPM_TOPDIR}/SRPMS"

SOURCE_DIR="${BUILD_DIR}/source"

SOURCE_ROOT="${SOURCE_DIR}/${APP_NAME}-${VERSION}"

DIST_DIR="${PROJECT_DIR}/dist"

RPM_FILE="${DIST_DIR}/${APP_NAME}-${VERSION}-${RELEASE}.${ARCH}.rpm"

SOURCE_TARBALL="${SOURCES_DIR}/${APP_NAME}-${VERSION}.tar.gz"

SPEC_FILE="${SPECS_DIR}/${APP_NAME}.spec"

INSTALL_DIR="/opt/${APP_NAME}"

CONFIG_FILE="/etc/default/file-manager"

SERVICE_NAME="file-manager"

MAINTAINER="KYGnus <support@kygnus.co>"

SUMMARY="KYGnus Web File Manager"

DESCRIPTION="Web-based Linux file manager built with Flask. Provides file browsing, upload, download, copy, move, rename, delete, chmod, compression and ZIP extraction."

URL="https://kygnus.github.io"


# ==========================================================
# COLORS
# ==========================================================

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'


# ==========================================================
# LOGGING
# ==========================================================

info()
{
    echo -e "${BLUE}[INFO]${NC} $1"
}

success()
{
    echo -e "${GREEN}[OK]${NC} $1"
}

warning()
{
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

error()
{
    echo -e "${RED}[ERROR]${NC} $1"
    exit 1
}


# ==========================================================
# HEADER
# ==========================================================

echo
echo "=========================================================="
echo " KYGnus Web File Manager"
echo " RPM Package Builder"
echo "=========================================================="
echo
echo "Package : ${APP_NAME}"
echo "Version : ${VERSION}"
echo "Release : ${RELEASE}"
echo "Arch    : ${ARCH}"
echo "Source  : ${PROJECT_DIR}"
echo "Install : ${INSTALL_DIR}"
echo


# ==========================================================
# ROOT CHECK
# ==========================================================

if [[ "${EUID}" -eq 0 ]]; then

    error "Do not run build-rpm as root."

fi


# ==========================================================
# REQUIRED COMMANDS
# ==========================================================

info "Checking build dependencies..."

REQUIRED_COMMANDS=(
    rpm
    rpmbuild
    python3
    rsync
    tar
)

for CMD in "${REQUIRED_COMMANDS[@]}"; do

    if ! command -v "${CMD}" >/dev/null 2>&1; then

        error "Required command '${CMD}' was not found.

Install the build tools with:

    sudo zypper install rpm-build rpm-build-python python3 rsync tar"

    fi

done

success "Build dependencies found."


# ==========================================================
# PYTHON CHECK
# ==========================================================

info "Checking Python..."

PYTHON_VERSION="$(python3 --version 2>&1)"

echo
echo "  ${PYTHON_VERSION}"
echo

success "Python available."


# ==========================================================
# PYTHON VENV CHECK
# ==========================================================

info "Checking Python virtual environment support..."

if ! python3 -m venv --help >/dev/null 2>&1; then

    error "Python venv support is unavailable.

Check:

    python3 -m venv --help
    python3 -m ensurepip --version

"

fi

success "Python venv support available."


# ==========================================================
# PROJECT FILE CHECK
# ==========================================================

info "Checking project files..."

if [[ ! -f "${PROJECT_DIR}/main.py" ]]; then

    error "main.py not found:

${PROJECT_DIR}/main.py"

fi


if [[ ! -f "${PROJECT_DIR}/requirements.txt" ]]; then

    error "requirements.txt not found:

${PROJECT_DIR}/requirements.txt"

fi


if [[ ! -d "${PROJECT_DIR}/templates" ]]; then

    error "templates directory not found:

${PROJECT_DIR}/templates"

fi


if [[ ! -d "${PROJECT_DIR}/static" ]]; then

    error "static directory not found:

${PROJECT_DIR}/static"

fi

success "Project files found."


# ==========================================================
# CLEAN BUILD
# ==========================================================

info "Cleaning previous build..."

rm -rf "${BUILD_DIR}"
rm -rf "${DIST_DIR}"

mkdir -p \
    "${SOURCES_DIR}" \
    "${SPECS_DIR}" \
    "${BUILDROOT_DIR}" \
    "${BUILD_DIR_RPM}" \
    "${RPMS_DIR}" \
    "${SRPMS_DIR}" \
    "${SOURCE_DIR}" \
    "${DIST_DIR}" \
    "${SOURCE_ROOT}"

success "Previous build cleaned."


# ==========================================================
# CREATE SOURCE TREE
# ==========================================================

info "Creating RPM source tree..."

mkdir -p \
    "${SOURCE_ROOT}/app" \
    "${SOURCE_ROOT}/etc/default" \
    "${SOURCE_ROOT}/usr/bin" \
    "${SOURCE_ROOT}/usr/lib/systemd/system" \
    "${SOURCE_ROOT}/usr/share/applications" \
    "${SOURCE_ROOT}/usr/share/doc/${APP_NAME}"

success "Source tree created."


# ==========================================================
# COPY APPLICATION
# ==========================================================

info "Copying application..."

rsync -a \
    --exclude=".git" \
    --exclude=".gitignore" \
    --exclude=".githooks" \
    --exclude=".github" \
    --exclude="venv" \
    --exclude="build" \
    --exclude="rpm_package" \
    --exclude="dist" \
    --exclude="*.rpm" \
    --exclude="*.deb" \
    --exclude="__pycache__" \
    --exclude="*.pyc" \
    --exclude="*.pyo" \
    --exclude=".pytest_cache" \
    --exclude=".mypy_cache" \
    --exclude=".cache" \
    "${PROJECT_DIR}/" \
    "${SOURCE_ROOT}/app/"

success "Application copied."


# ==========================================================
# VERIFY DEVELOPMENT FILES WERE EXCLUDED
# ==========================================================

if [[ -e "${SOURCE_ROOT}/app/.githooks" ]]; then

    error ".githooks was not excluded from the RPM source."

fi


if [[ -e "${SOURCE_ROOT}/app/.github" ]]; then

    error ".github was not excluded from the RPM source."

fi

success "Development files excluded."


# ==========================================================
# CREATE CONFIGURATION
# ==========================================================

info "Creating configuration..."

cat > "${SOURCE_ROOT}/etc/default/file-manager" <<'EOF'
# ==========================================================
# KYGnus Web File Manager
# ==========================================================

# Linux user running the application.
#
# The RPM post-install script automatically changes this
# to the user that installed the package.

FILE_MANAGER_USER=koosha

# Root directory exposed by the file manager.
#
# If empty, the service will use:
#
#   /home/$FILE_MANAGER_USER
#
FILE_MANAGER_ROOT=

# Flask network configuration

FILE_MANAGER_HOST=0.0.0.0
FILE_MANAGER_PORT=5005

# Flask debug mode
#
# 0 = disabled
# 1 = enabled
#
FILE_MANAGER_DEBUG=0
EOF

success "Configuration created."


# ==========================================================
# CREATE CLI COMMAND
# ==========================================================

info "Creating file-manager command..."

cat > "${SOURCE_ROOT}/usr/bin/file-manager" <<'EOF'
#!/usr/bin/env bash

set -e

APP_DIR="/opt/KYGnus-file-manager"
SERVICE_NAME="file-manager"


# ==========================================================
# DETECT SERVICE MANAGER
# ==========================================================

if command -v systemctl >/dev/null 2>&1; then

    SERVICE_MANAGER="systemd"

elif command -v sv >/dev/null 2>&1; then

    SERVICE_MANAGER="runit"

elif [[ -d "/etc/service" ]]; then

    SERVICE_MANAGER="runit"

else

    SERVICE_MANAGER="none"

fi


# ==========================================================
# START
# ==========================================================

case "${1:-}" in

    start)

        if [[ "${SERVICE_MANAGER}" == "systemd" ]]; then

            sudo systemctl start file-manager.service

        elif [[ "${SERVICE_MANAGER}" == "runit" ]]; then

            sudo sv start file-manager

        else

            echo "No supported service manager detected."
            exit 1

        fi

        ;;


    # ======================================================
    # STOP
    # ======================================================

    stop)

        if [[ "${SERVICE_MANAGER}" == "systemd" ]]; then

            sudo systemctl stop file-manager.service

        elif [[ "${SERVICE_MANAGER}" == "runit" ]]; then

            sudo sv stop file-manager

        else

            echo "No supported service manager detected."
            exit 1

        fi

        ;;


    # ======================================================
    # RESTART
    # ======================================================

    restart)

        if [[ "${SERVICE_MANAGER}" == "systemd" ]]; then

            sudo systemctl restart file-manager.service

        elif [[ "${SERVICE_MANAGER}" == "runit" ]]; then

            sudo sv restart file-manager

        else

            echo "No supported service manager detected."
            exit 1

        fi

        ;;


    # ======================================================
    # STATUS
    # ======================================================

    status)

        if [[ "${SERVICE_MANAGER}" == "systemd" ]]; then

            systemctl status file-manager.service

        elif [[ "${SERVICE_MANAGER}" == "runit" ]]; then

            sv status file-manager

        else

            echo "No supported service manager detected."
            exit 1

        fi

        ;;


    # ======================================================
    # LOGS
    # ======================================================

    logs)

        if [[ "${SERVICE_MANAGER}" == "systemd" ]]; then

            journalctl -u file-manager.service -f

        elif [[ "${SERVICE_MANAGER}" == "runit" ]]; then

            if [[ -f "/var/log/file-manager/current" ]]; then

                tail -f /var/log/file-manager/current

            else

                echo "runit log file not found:"
                echo
                echo "  /var/log/file-manager/current"
                echo
                echo "Try:"
                echo
                echo "  sudo sv status file-manager"

            fi

        else

            echo "No supported service manager detected."

        fi

        ;;


    # ======================================================
    # OPEN
    # ======================================================

    open)

        URL="http://127.0.0.1:5005"

        if command -v xdg-open >/dev/null 2>&1; then

            xdg-open "${URL}"

        else

            echo
            echo "Open:"
            echo
            echo "  ${URL}"
            echo

        fi

        ;;


    # ======================================================
    # RUN MANUALLY
    # ======================================================

    run)

        cd "${APP_DIR}"

        exec "${APP_DIR}/venv/bin/python" \
            "${APP_DIR}/main.py"

        ;;


    # ======================================================
    # VERSION
    # ======================================================

    version)

        echo "KYGnus File Manager 1.0.1"

        ;;


    # ======================================================
    # HELP
    # ======================================================

    help|--help|-h|"")

        echo
        echo "KYGnus Web File Manager"
        echo
        echo "Usage:"
        echo
        echo "  file-manager start"
        echo "  file-manager stop"
        echo "  file-manager restart"
        echo "  file-manager status"
        echo "  file-manager logs"
        echo "  file-manager open"
        echo "  file-manager run"
        echo "  file-manager version"
        echo "  file-manager help"
        echo

        ;;


    # ======================================================
    # UNKNOWN COMMAND
    # ======================================================

    *)

        echo "Unknown command: ${1}"
        echo
        echo "Run:"
        echo
        echo "  file-manager help"
        echo

        exit 1

        ;;

esac
EOF

chmod 755 "${SOURCE_ROOT}/usr/bin/file-manager"

success "CLI command created."


# ==========================================================
# CREATE SYSTEMD SERVICE
# ==========================================================

info "Creating systemd service..."

cat > "${SOURCE_ROOT}/usr/lib/systemd/system/file-manager.service" <<'EOF'
[Unit]
Description=KYGnus Web File Manager
After=network.target

[Service]
Type=simple

EnvironmentFile=-/etc/default/file-manager

User=@FILE_MANAGER_USER@

WorkingDirectory=/opt/KYGnus-file-manager

Environment=PYTHONUNBUFFERED=1

ExecStart=/opt/KYGnus-file-manager/venv/bin/python /opt/KYGnus-file-manager/main.py

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

success "systemd service created."


# ==========================================================
# CREATE DESKTOP FILE
# ==========================================================

info "Creating desktop entry..."

cat > "${SOURCE_ROOT}/usr/share/applications/file-manager.desktop" <<'EOF'
[Desktop Entry]
Version=1.0
Type=Application
Name=KYGnus Web File Manager
GenericName=Web File Manager
Comment=KYGnus Web-based Linux File Manager
Exec=xdg-open http://127.0.0.1:5005
Terminal=false
Categories=Utility;FileManager;
StartupNotify=false
EOF

success "Desktop entry created."


# ==========================================================
# CREATE DOCUMENTATION
# ==========================================================

info "Creating documentation..."

cat > "${SOURCE_ROOT}/usr/share/doc/${APP_NAME}/README.rpm" <<EOF
KYGnus Web File Manager
=======================

Package:
  ${APP_NAME}

Version:
  ${VERSION}-${RELEASE}

Application:
  ${INSTALL_DIR}

Configuration:
  ${CONFIG_FILE}

Web interface:
  http://127.0.0.1:5005

CLI:
  file-manager start
  file-manager stop
  file-manager restart
  file-manager status
  file-manager logs
  file-manager open
  file-manager run
  file-manager version

Supported init systems:
  systemd
  runit
  manual fallback
EOF

success "Documentation created."


# ==========================================================
# CREATE PYTHON VIRTUAL ENVIRONMENT
# ==========================================================

info "Creating Python virtual environment..."

python3 -m venv \
    "${SOURCE_ROOT}/app/venv"

success "Python virtual environment created."


# ==========================================================
# PREPARE PYTHON ENVIRONMENT
# ==========================================================

info "Preparing Python environment..."

"${SOURCE_ROOT}/app/venv/bin/python" \
    -m pip install \
    --upgrade \
    pip \
    setuptools \
    wheel

success "pip/setuptools/wheel prepared."


# ==========================================================
# INSTALL REQUIREMENTS
# ==========================================================

info "Installing Python requirements..."

"${SOURCE_ROOT}/app/venv/bin/pip" \
    install \
    -r "${SOURCE_ROOT}/app/requirements.txt"

success "Python requirements installed."


# ==========================================================
# VERIFY PYTHON ENVIRONMENT
# ==========================================================

info "Verifying Python environment..."

"${SOURCE_ROOT}/app/venv/bin/python" \
    --version

"${SOURCE_ROOT}/app/venv/bin/python" \
    -c "import sys; print('Python executable:', sys.executable)"

success "Python environment verified."


# ==========================================================
# CLEAN VENV CACHE
# ==========================================================

info "Cleaning Python cache files..."

find "${SOURCE_ROOT}/app/venv" \
    -type d \
    -name "__pycache__" \
    -prune \
    -exec rm -rf {} + 2>/dev/null || true

find "${SOURCE_ROOT}/app/venv" \
    -type f \
    \( \
        -name "*.pyc" \
        -o -name "*.pyo" \
    \) \
    -delete 2>/dev/null || true

success "Python cache cleaned."


# ==========================================================
# SOURCE PERMISSIONS
# ==========================================================

info "Fixing permissions..."

find "${SOURCE_ROOT}/app" \
    -type d \
    -exec chmod 755 {} \;

find "${SOURCE_ROOT}/app" \
    -type f \
    -exec chmod 644 {} \;

chmod 755 \
    "${SOURCE_ROOT}/app/main.py"

chmod 755 \
    "${SOURCE_ROOT}/usr/bin/file-manager"

chmod 644 \
    "${SOURCE_ROOT}/etc/default/file-manager"

chmod 644 \
    "${SOURCE_ROOT}/usr/lib/systemd/system/file-manager.service"

chmod 644 \
    "${SOURCE_ROOT}/usr/share/applications/file-manager.desktop"

success "Permissions fixed."


# ==========================================================
# CREATE SOURCE ARCHIVE
# ==========================================================

info "Creating source archive..."

tar \
    -C "${SOURCE_DIR}" \
    -czf "${SOURCE_TARBALL}" \
    "${APP_NAME}-${VERSION}"

success "Source archive created."


# ==========================================================
# VERIFY SOURCE ARCHIVE
# ==========================================================

info "Verifying source archive..."

if ! tar -tzf "${SOURCE_TARBALL}" >/dev/null 2>&1; then

    error "Source archive is invalid."

fi

success "Source archive verified."


# ==========================================================
# CREATE SPEC FILE
# ==========================================================

info "Creating RPM spec file..."

cat > "${SPEC_FILE}" <<'SPEC'
Name:           @APP_NAME@
Version:        @VERSION@
Release:        @RELEASE@%{?dist}
Summary:        @SUMMARY@
License:        Proprietary
URL:            @URL@
Source0:        %{name}-%{version}.tar.gz

BuildArch:      @ARCH@

Requires:       python3
Requires:       python3-pip

%description
@DESCRIPTION@

%prep

%setup -q


%build

# Application dependencies and Python virtual environment
# are prepared by the outer build-rpm script.


%install

rm -rf %{buildroot}


# ==========================================================
# APPLICATION
# ==========================================================

mkdir -p %{buildroot}/opt/KYGnus-file-manager

cp -a app/. \
    %{buildroot}/opt/KYGnus-file-manager/


# ==========================================================
# CONFIGURATION
# ==========================================================

mkdir -p %{buildroot}/etc/default

cp etc/default/file-manager \
    %{buildroot}/etc/default/file-manager


# ==========================================================
# CLI
# ==========================================================

mkdir -p %{buildroot}/usr/bin

cp usr/bin/file-manager \
    %{buildroot}/usr/bin/file-manager


# ==========================================================
# SYSTEMD
# ==========================================================

mkdir -p %{buildroot}/usr/lib/systemd/system

cp usr/lib/systemd/system/file-manager.service \
    %{buildroot}/usr/lib/systemd/system/file-manager.service


# ==========================================================
# DESKTOP
# ==========================================================

mkdir -p %{buildroot}/usr/share/applications

cp usr/share/applications/file-manager.desktop \
    %{buildroot}/usr/share/applications/file-manager.desktop


# ==========================================================
# DOCUMENTATION
# ==========================================================

mkdir -p %{buildroot}/usr/share/doc/KYGnus-file-manager

cp -a usr/share/doc/KYGnus-file-manager/. \
    %{buildroot}/usr/share/doc/KYGnus-file-manager/


# ==========================================================
# LOG DIRECTORY
# ==========================================================

mkdir -p %{buildroot}/var/log/file-manager


# ==========================================================
# SYSTEMD PLACEHOLDER
# ==========================================================

sed -i \
    's/@FILE_MANAGER_USER@/root/g' \
    %{buildroot}/usr/lib/systemd/system/file-manager.service


%pre

#!/bin/sh

exit 0


%post

#!/bin/bash

set +e

APP_NAME="file-manager"
INSTALL_DIR="/opt/KYGnus-file-manager"
CONFIG_FILE="/etc/default/file-manager"

echo
echo "=============================================="
echo " KYGnus File Manager"
echo " RPM Post Installation"
echo "=============================================="
echo


# ==========================================================
# DETECT INSTALLING USER
# ==========================================================

CURRENT_USER="${SUDO_USER:-}"

if [[ -z "${CURRENT_USER}" || "${CURRENT_USER}" == "root" ]]; then

    CURRENT_USER="$(logname 2>/dev/null || true)"

fi


if [[ -z "${CURRENT_USER}" || "${CURRENT_USER}" == "root" ]]; then

    if [[ -n "${PKEXEC_UID:-}" ]]; then

        CURRENT_USER="$(
            id -nu "${PKEXEC_UID}" 2>/dev/null || true
        )"

    fi

fi


if [[ -z "${CURRENT_USER}" ]]; then

    CURRENT_USER="root"

fi


# ==========================================================
# VALIDATE USER
# ==========================================================

if ! id "${CURRENT_USER}" >/dev/null 2>&1; then

    echo "WARNING:"
    echo "User '${CURRENT_USER}' does not exist."
    echo

    CURRENT_USER="root"

fi


echo "Application user: ${CURRENT_USER}"


# ==========================================================
# CONFIGURE USER
# ==========================================================

if [[ -f "${CONFIG_FILE}" ]]; then

    sed -i \
        "s/^FILE_MANAGER_USER=.*/FILE_MANAGER_USER=${CURRENT_USER}/" \
        "${CONFIG_FILE}"

fi


# ==========================================================
# CONFIGURE ROOT
# ==========================================================

if [[ "${CURRENT_USER}" != "root" ]]; then

    if [[ -d "/home/${CURRENT_USER}" ]]; then

        sed -i \
            "s|^FILE_MANAGER_ROOT=.*|FILE_MANAGER_ROOT=/home/${CURRENT_USER}|" \
            "${CONFIG_FILE}"

    fi

fi


# ==========================================================
# APPLICATION OWNERSHIP
# ==========================================================

if [[ "${CURRENT_USER}" != "root" ]]; then

    chown -R \
        "${CURRENT_USER}:${CURRENT_USER}" \
        "${INSTALL_DIR}"

fi


# ==========================================================
# SYSTEMD
# ==========================================================

if command -v systemctl >/dev/null 2>&1; then

    echo
    echo "Detected init system: systemd"
    echo

    SERVICE_FILE="/usr/lib/systemd/system/file-manager.service"

    if [[ -f "${SERVICE_FILE}" ]]; then

        sed -i \
            "s/^User=.*/User=${CURRENT_USER}/" \
            "${SERVICE_FILE}"

    fi


    systemctl daemon-reload 2>/dev/null || true

    systemctl enable file-manager.service 2>/dev/null || true

    systemctl restart file-manager.service 2>/dev/null || true


    echo
    echo "systemd service installed."
    echo


# ==========================================================
# RUNIT
# ==========================================================

elif command -v sv >/dev/null 2>&1 || [[ -d "/etc/service" ]]; then

    echo
    echo "Detected init system: runit"
    echo

    SERVICE_DIR="/etc/service/file-manager"

    mkdir -p "${SERVICE_DIR}"


    cat > "${SERVICE_DIR}/run" <<SERVICE
#!/bin/sh

cd /opt/KYGnus-file-manager || exit 1

if [ -f /etc/default/file-manager ]; then
    . /etc/default/file-manager
fi

export FILE_MANAGER_USER="${CURRENT_USER}"

if [ -z "\${FILE_MANAGER_ROOT}" ]; then
    export FILE_MANAGER_ROOT="/home/${CURRENT_USER}"
fi

export FILE_MANAGER_HOST="\${FILE_MANAGER_HOST:-0.0.0.0}"
export FILE_MANAGER_PORT="\${FILE_MANAGER_PORT:-5005}"
export FILE_MANAGER_DEBUG="\${FILE_MANAGER_DEBUG:-0}"
export PYTHONUNBUFFERED=1

exec chpst -u "${CURRENT_USER}" \
    /opt/KYGnus-file-manager/venv/bin/python \
    /opt/KYGnus-file-manager/main.py
SERVICE


    chmod 755 "${SERVICE_DIR}/run"


    # ------------------------------------------------------
    # Runit logging
    # ------------------------------------------------------

    mkdir -p "${SERVICE_DIR}/log"


    cat > "${SERVICE_DIR}/log/run" <<'LOG'
#!/bin/sh

mkdir -p /var/log/file-manager

exec svlogd /var/log/file-manager
LOG


    chmod 755 "${SERVICE_DIR}/log/run"


    # ------------------------------------------------------
    # Start
    # ------------------------------------------------------

    if command -v sv >/dev/null 2>&1; then

        sv start file-manager 2>/dev/null || true

    fi


    echo
    echo "runit service installed."
    echo


# ==========================================================
# MANUAL FALLBACK
# ==========================================================

else

    echo
    echo "No systemd or runit service manager detected."
    echo
    echo "The application was installed successfully."
    echo
    echo "Run manually:"
    echo
    echo "  file-manager run"
    echo

fi


# ==========================================================
# FINAL MESSAGE
# ==========================================================

echo
echo "=============================================="
echo " Installation complete"
echo "=============================================="
echo
echo "Application:"
echo "  /opt/KYGnus-file-manager"
echo
echo "Configuration:"
echo "  /etc/default/file-manager"
echo
echo "Web interface:"
echo "  http://127.0.0.1:5005"
echo
echo "LAN:"
echo "  http://SERVER_IP:5005"
echo
echo "Commands:"
echo
echo "  file-manager status"
echo "  file-manager start"
echo "  file-manager stop"
echo "  file-manager restart"
echo "  file-manager logs"
echo "  file-manager open"
echo "  file-manager run"
echo
echo "=============================================="
echo

exit 0


%preun

#!/bin/bash

set +e

if [[ "$1" -eq 0 ]]; then

    if command -v systemctl >/dev/null 2>&1; then

        systemctl stop file-manager.service 2>/dev/null || true
        systemctl disable file-manager.service 2>/dev/null || true

    fi


    if command -v sv >/dev/null 2>&1; then

        sv stop file-manager 2>/dev/null || true

    fi

fi

exit 0


%postun

#!/bin/bash

set +e

if [[ "$1" -eq 0 ]]; then

    if command -v systemctl >/dev/null 2>&1; then

        systemctl daemon-reload 2>/dev/null || true

    fi

fi

exit 0


%files

%defattr(-,root,root,-)


# ==========================================================
# APPLICATION
# ==========================================================

%dir /opt/KYGnus-file-manager

/opt/KYGnus-file-manager/*


# ==========================================================
# CONFIGURATION
# ==========================================================

%config(noreplace) /etc/default/file-manager


# ==========================================================
# CLI
# ==========================================================

/usr/bin/file-manager


# ==========================================================
# SYSTEMD
# ==========================================================

/usr/lib/systemd/system/file-manager.service


# ==========================================================
# DESKTOP
# ==========================================================

/usr/share/applications/file-manager.desktop


# ==========================================================
# DOCUMENTATION
# ==========================================================

%doc /usr/share/doc/KYGnus-file-manager/README.rpm


# ==========================================================
# LOG DIRECTORY
# ==========================================================

%dir /var/log/file-manager


%changelog

* Thu Sep 24 2026 KYGnus <support@kygnus.co> - 1.0.1-1
- Initial RPM package
- Flask web file manager
- Python virtual environment
- systemd support
- runit support
- Manual execution fallback
SPEC

success "RPM spec created."


# ==========================================================
# REPLACE SPEC VARIABLES
# ==========================================================

python3 - \
    "${SPEC_FILE}" \
    "${APP_NAME}" \
    "${VERSION}" \
    "${RELEASE}" \
    "${SUMMARY}" \
    "${URL}" \
    "${DESCRIPTION}" \
    "${ARCH}" <<'PY'
from pathlib import Path
import sys

spec_file = Path(sys.argv[1])

replacements = {
    "@APP_NAME@": sys.argv[2],
    "@VERSION@": sys.argv[3],
    "@RELEASE@": sys.argv[4],
    "@SUMMARY@": sys.argv[5],
    "@URL@": sys.argv[6],
    "@DESCRIPTION@": sys.argv[7],
    "@ARCH@": sys.argv[8],
}

text = spec_file.read_text(encoding="utf-8")

for old, new in replacements.items():
    text = text.replace(old, new)

spec_file.write_text(text, encoding="utf-8")
PY


# ==========================================================
# VALIDATE SPEC
# ==========================================================

info "Validating RPM spec..."

if grep -Eq '@APP_NAME@|@VERSION@|@RELEASE@|@SUMMARY@|@DESCRIPTION@|@ARCH@' \
    "${SPEC_FILE}"; then

    error "Unresolved RPM spec placeholders remain."

fi

if grep -q 'python3-venv' "${SPEC_FILE}"; then

    error "Debian dependency python3-venv found in RPM spec."

fi

if grep -q 'cp -a app/\*' "${SPEC_FILE}"; then

    error "Invalid app wildcard found in RPM spec."

fi

success "RPM spec validated."


# ==========================================================
# BUILD RPM
# ==========================================================

echo
info "Building RPM..."
echo

rpmbuild \
    --define "_topdir ${RPM_TOPDIR}" \
    --define "_builddir ${BUILD_DIR_RPM}" \
    --define "_buildrootdir ${BUILDROOT_DIR}" \
    --define "_rpmdir ${RPMS_DIR}" \
    --define "_srcrpmdir ${SRPMS_DIR}" \
    --define "_sourcedir ${SOURCES_DIR}" \
    --define "_specdir ${SPECS_DIR}" \
    --define "_tmppath ${BUILD_DIR}/tmp" \
    --define "debug_package %{nil}" \
    -bb "${SPEC_FILE}"

success "rpmbuild completed."


# ==========================================================
# FIND FINAL RPM
# ==========================================================

info "Locating final RPM..."

FOUND_RPM=""

while IFS= read -r CANDIDATE; do

    [[ -z "${CANDIDATE}" ]] && continue

    PACKAGE_NAME="$(
        rpm -qp --qf '%{NAME}' \
            "${CANDIDATE}" \
            2>/dev/null || true
    )"

    PACKAGE_VERSION="$(
        rpm -qp --qf '%{VERSION}' \
            "${CANDIDATE}" \
            2>/dev/null || true
    )"

    PACKAGE_RELEASE="$(
        rpm -qp --qf '%{RELEASE}' \
            "${CANDIDATE}" \
            2>/dev/null || true
    )"

    PACKAGE_ARCH="$(
        rpm -qp --qf '%{ARCH}' \
            "${CANDIDATE}" \
            2>/dev/null || true
    )"


    if [[ "${PACKAGE_NAME}" == "${APP_NAME}" ]] \
        && [[ "${PACKAGE_VERSION}" == "${VERSION}" ]] \
        && [[ "${PACKAGE_RELEASE}" == "${RELEASE}"* ]] \
        && [[ "${PACKAGE_ARCH}" == "${ARCH}" ]]; then

        FOUND_RPM="${CANDIDATE}"
        break

    fi

done < <(
    find "${RPMS_DIR}" \
        -type f \
        -name '*.rpm' \
        -print
)

if [[ -z "${FOUND_RPM}" ]]; then

    echo
    echo "RPM files found:"
    find "${RPMS_DIR}" \
        -type f \
        -name '*.rpm' \
        -print
    echo

    error "Expected ${APP_NAME} RPM was not found."

fi


# ==========================================================
# COPY FINAL RPM
# ==========================================================

cp -f \
    "${FOUND_RPM}" \
    "${RPM_FILE}"

success "Final RPM copied."


# ==========================================================
# VERIFY METADATA
# ==========================================================

info "Verifying RPM metadata..."

rpm -qpi "${RPM_FILE}"

success "RPM metadata verified."


# ==========================================================
# VERIFY CONTENTS
# ==========================================================

info "Verifying RPM contents..."

PACKAGE_CONTENTS="${BUILD_DIR}/package-files.txt"

rpm -qpl "${RPM_FILE}" \
    > "${PACKAGE_CONTENTS}"

REQUIRED_FILES=(
    "/opt/KYGnus-file-manager/main.py"
    "/opt/KYGnus-file-manager/requirements.txt"
    "/opt/KYGnus-file-manager/venv/bin/python"
    "/usr/bin/file-manager"
    "/etc/default/file-manager"
    "/usr/lib/systemd/system/file-manager.service"
    "/usr/share/applications/file-manager.desktop"
)

for REQUIRED_FILE in "${REQUIRED_FILES[@]}"; do

    if ! grep -Fxq \
        "${REQUIRED_FILE}" \
        "${PACKAGE_CONTENTS}"; then

        error "Required package file is missing:

${REQUIRED_FILE}"

    fi

done

success "Required package files verified."


# ==========================================================
# VERIFY DEVELOPMENT FILES ARE NOT INCLUDED
# ==========================================================

if grep -q '/.githooks/' "${PACKAGE_CONTENTS}"; then

    error ".githooks files were included in the RPM."

fi

if grep -q '/.github/' "${PACKAGE_CONTENTS}"; then

    error ".github files were included in the RPM."

fi

success "Development files are excluded from RPM."


# ==========================================================
# VERIFY DEPENDENCIES
# ==========================================================

info "Checking RPM dependencies..."

RPM_REQUIRES="$(
    rpm -qpR "${RPM_FILE}"
)"

if echo "${RPM_REQUIRES}" | grep -qx 'python3-venv'; then

    error "Invalid dependency python3-venv found."

fi

echo
echo "${RPM_REQUIRES}"
echo

success "RPM dependencies checked."


# ==========================================================
# PACKAGE SIZE
# ==========================================================

PACKAGE_SIZE="$(
    du -h "${RPM_FILE}" |
    awk '{print $1}'
)"


# ==========================================================
# FINAL RESULT
# ==========================================================

echo
echo "=========================================================="
echo " RPM PACKAGE SUCCESSFULLY CREATED"
echo "=========================================================="
echo
echo "Package:"
echo
echo "  ${RPM_FILE}"
echo
echo "Version:"
echo
echo "  ${VERSION}-${RELEASE}"
echo
echo "Architecture:"
echo
echo "  ${ARCH}"
echo
echo "Size:"
echo
echo "  ${PACKAGE_SIZE}"
echo
echo "Install with zypper:"
echo
echo "  sudo zypper install ./dist/${APP_NAME}-${VERSION}-${RELEASE}.${ARCH}.rpm"
echo
echo "Or with rpm:"
echo
echo "  sudo rpm -ivh ./dist/${APP_NAME}-${VERSION}-${RELEASE}.${ARCH}.rpm"
echo
echo "After installation:"
echo
echo "  file-manager status"
echo
echo "  file-manager open"
echo
echo "  file-manager logs"
echo
echo "=========================================================="
echo
