
#!/usr/bin/env bash

# ==========================================================
# KYGnus Web File Manager
# Debian Package Builder
#
# Project:
#   WebBase-FileManager
#
# Package:
#   file-manager
#
# Version:
#   1.0.1
#
# Supports:
#   - Debian + systemd
#   - antiX + runit
#   - SysVinit/manual fallback
#
# Build:
#   chmod +x build-deb
#   ./build-deb
#
# Output:
#   file-manager_1.0.1_amd64.deb
# ==========================================================

set -e

# ----------------------------------------------------------
# Force Bash
# ----------------------------------------------------------

if [ -z "${BASH_VERSION:-}" ]; then
    echo "ERROR: This script must be executed with Bash."
    echo
    echo "Run:"
    echo "  bash ./build-deb"
    exit 1
fi

# ----------------------------------------------------------
# Configuration
# ----------------------------------------------------------

APP_NAME="file-manager"
VERSION="1.0.1"
ARCH="amd64"

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

BUILD_DIR="${PROJECT_DIR}/build"
PACKAGE_DIR="${BUILD_DIR}/${APP_NAME}_${VERSION}_${ARCH}"

INSTALL_DIR="/opt/${APP_NAME}"

DEB_FILE="${PROJECT_DIR}/${APP_NAME}_${VERSION}_${ARCH}.deb"

# ----------------------------------------------------------
# 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 " Debian Package Builder"
echo "=========================================================="
echo
echo "Project : ${APP_NAME}"
echo "Version : ${VERSION}"
echo "Arch    : ${ARCH}"
echo "Source  : ${PROJECT_DIR}"
echo

# ----------------------------------------------------------
# Check root
# ----------------------------------------------------------

if [[ "${EUID}" -eq 0 ]]; then
    error "Do not run build-deb as root."
fi

# ----------------------------------------------------------
# Check required commands
# ----------------------------------------------------------

info "Checking build dependencies..."

REQUIRED_COMMANDS=(
    dpkg-deb
    python3
    rsync
)

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

    if ! command -v "${CMD}" >/dev/null 2>&1; then
        error "Required command '${CMD}' was not found."
    fi

done

success "Build dependencies found."

# ----------------------------------------------------------
# Check Python venv support
# ----------------------------------------------------------

info "Checking Python virtual environment support..."

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

    error "Python venv support is missing.

Install it with:

    sudo apt install python3-venv"

fi

success "Python venv support available."

# ----------------------------------------------------------
# Check project files
# ----------------------------------------------------------

info "Checking project files..."

if [[ ! -f "${PROJECT_DIR}/main.py" ]]; then
    error "main.py not found in:

${PROJECT_DIR}"
fi

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

if [[ ! -d "${PROJECT_DIR}/templates" ]]; then
    error "templates directory not found."
fi

if [[ ! -d "${PROJECT_DIR}/static" ]]; then
    error "static directory not found."
fi

success "Project files found."

# ----------------------------------------------------------
# Clean previous build
# ----------------------------------------------------------

info "Cleaning previous build..."

rm -rf "${BUILD_DIR}"
rm -f "${DEB_FILE}"

mkdir -p "${PACKAGE_DIR}"

# ----------------------------------------------------------
# Debian package directories
# ----------------------------------------------------------

info "Creating Debian package structure..."

mkdir -p "${PACKAGE_DIR}/DEBIAN"

mkdir -p "${PACKAGE_DIR}${INSTALL_DIR}"

mkdir -p "${PACKAGE_DIR}/etc/default"

mkdir -p "${PACKAGE_DIR}/usr/bin"

# ----------------------------------------------------------
# Copy project
# ----------------------------------------------------------

info "Copying application files..."

rsync -a \
    --exclude=".git" \
    --exclude=".gitignore" \
    --exclude="venv" \
    --exclude="build" \
    --exclude="*.deb" \
    --exclude="__pycache__" \
    --exclude="*.pyc" \
    --exclude="*.pyo" \
    --exclude=".pytest_cache" \
    "${PROJECT_DIR}/" \
    "${PACKAGE_DIR}${INSTALL_DIR}/"

success "Application copied."

# ----------------------------------------------------------
# Create Python virtual environment
# ----------------------------------------------------------

info "Creating Python virtual environment..."

python3 -m venv \
    "${PACKAGE_DIR}${INSTALL_DIR}/venv"

success "Virtual environment created."

# ----------------------------------------------------------
# Upgrade pip
# ----------------------------------------------------------

info "Preparing Python environment..."

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

# ----------------------------------------------------------
# Install requirements
# ----------------------------------------------------------

info "Installing Python requirements..."

"${PACKAGE_DIR}${INSTALL_DIR}/venv/bin/pip" \
    install \
    -r "${PACKAGE_DIR}${INSTALL_DIR}/requirements.txt"

success "Python requirements installed."

# ----------------------------------------------------------
# Application configuration
# ----------------------------------------------------------

info "Creating application configuration..."

cat > "${PACKAGE_DIR}/etc/default/${APP_NAME}" <<'EOF'
# ==========================================================
# KYGnus Web File Manager
# ==========================================================

# Linux user running the application.
#
# The Debian 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, main.py 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."

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

info "Creating file-manager command..."

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

APP_DIR="/opt/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 browser
    # ------------------------------------------------------

    open)

        URL="http://127.0.0.1:5005"

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

            xdg-open "${URL}"

        else

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

        fi

        ;;

    # ------------------------------------------------------
    # Run manually
    # ------------------------------------------------------

    run)

        cd "${APP_DIR}"

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

        ;;

    # ------------------------------------------------------
    # Version
    # ------------------------------------------------------

    version)

        echo "KYGnus File Manager ${VERSION}"

        ;;

    # ------------------------------------------------------
    # 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

        ;;

    # ------------------------------------------------------
    # Unknown command
    # ------------------------------------------------------

    *)

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

        exit 1

        ;;

esac
EOF

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

success "CLI command created."

# ==========================================================
# DEBIAN CONTROL
# ==========================================================

info "Creating Debian control file..."

cat > "${PACKAGE_DIR}/DEBIAN/control" <<EOF
Package: ${APP_NAME}
Version: ${VERSION}
Section: utils
Priority: optional
Architecture: ${ARCH}
Maintainer: KYGnus <support@kygnus.co>
Depends: python3, python3-venv
Description: KYGnus Web File Manager
 Web-based Linux file manager built with Flask.
 Provides file browsing, upload, download, copy, move,
 rename, delete, chmod, compression and ZIP extraction.
EOF

success "Debian control file created."

# ==========================================================
# POST-INSTALLATION
# ==========================================================

info "Creating post-installation script..."

cat > "${PACKAGE_DIR}/DEBIAN/postinst" <<'EOF'
#!/usr/bin/env bash

set -e

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

echo
echo "=============================================="
echo " KYGnus File Manager"
echo " 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
# ----------------------------------------------------------

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

# ----------------------------------------------------------
# Configure root directory
# ----------------------------------------------------------

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

# ----------------------------------------------------------
# Permissions
# ----------------------------------------------------------

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

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

fi

# ==========================================================
# Detect INIT SYSTEM
# ==========================================================

# ----------------------------------------------------------
# systemd
# ----------------------------------------------------------

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

    echo
    echo "Detected init system: systemd"
    echo

    mkdir -p /etc/systemd/system

    cat > /etc/systemd/system/file-manager.service <<SERVICE
[Unit]
Description=KYGnus Web File Manager
After=network.target

[Service]
Type=simple

EnvironmentFile=-/etc/default/file-manager

User=${CURRENT_USER}

WorkingDirectory=/opt/file-manager

Environment=PYTHONUNBUFFERED=1

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

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
SERVICE

    systemctl daemon-reload

    systemctl enable file-manager.service

    systemctl restart file-manager.service || 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}"

    # ------------------------------------------------------
    # run script
    # ------------------------------------------------------

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

cd /opt/file-manager || exit 1

# Load configuration
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/file-manager/venv/bin/python \
    /opt/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 || true

    fi

    echo
    echo "runit service installed."
    echo

# ----------------------------------------------------------
# SysVinit / no service manager
# ----------------------------------------------------------

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/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
echo "=============================================="
echo

exit 0
EOF

chmod 755 "${PACKAGE_DIR}/DEBIAN/postinst"

success "Post-installation script created."

# ==========================================================
# PRE-REMOVAL
# ==========================================================

info "Creating pre-removal script..."

cat > "${PACKAGE_DIR}/DEBIAN/prerm" <<'EOF'
#!/usr/bin/env bash

set +e

# ----------------------------------------------------------
# Stop systemd service
# ----------------------------------------------------------

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

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

fi

# ----------------------------------------------------------
# Stop runit service
# ----------------------------------------------------------

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

    sv stop file-manager 2>/dev/null

fi

exit 0
EOF

chmod 755 "${PACKAGE_DIR}/DEBIAN/prerm"

# ==========================================================
# POST-REMOVE
# ==========================================================

info "Creating post-removal script..."

cat > "${PACKAGE_DIR}/DEBIAN/postrm" <<'EOF'
#!/usr/bin/env bash

set +e

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

    systemctl daemon-reload 2>/dev/null

fi

exit 0
EOF

chmod 755 "${PACKAGE_DIR}/DEBIAN/postrm"

success "Removal scripts created."

# ==========================================================
# PACKAGE PERMISSIONS
# ==========================================================

info "Fixing package permissions..."

find "${PACKAGE_DIR}${INSTALL_DIR}" \
    -type d \
    -exec chmod 755 {} \;

find "${PACKAGE_DIR}${INSTALL_DIR}" \
    -type f \
    -exec chmod 644 {} \;

chmod 755 \
    "${PACKAGE_DIR}${INSTALL_DIR}/main.py"

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

chmod 755 \
    "${PACKAGE_DIR}/DEBIAN/postinst"

chmod 755 \
    "${PACKAGE_DIR}/DEBIAN/prerm"

chmod 755 \
    "${PACKAGE_DIR}/DEBIAN/postrm"

# ==========================================================
# BUILD DEB
# ==========================================================

echo
info "Building Debian package..."
echo

dpkg-deb \
    --build \
    --root-owner-group \
    "${PACKAGE_DIR}" \
    "${DEB_FILE}"

# ==========================================================
# VERIFY PACKAGE
# ==========================================================

echo
info "Verifying package..."

if ! dpkg-deb --info "${DEB_FILE}" >/dev/null 2>&1; then

    error "Generated .deb failed verification."

fi

if ! dpkg-deb --contents "${DEB_FILE}" >/dev/null 2>&1; then

    error "Could not read generated package contents."

fi

success "Package verification successful."

# ==========================================================
# PACKAGE INFORMATION
# ==========================================================

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

echo
echo "=========================================================="
echo " Debian package successfully created"
echo "=========================================================="
echo
echo "Package:"
echo
echo "  ${DEB_FILE}"
echo
echo "Version:"
echo
echo "  ${VERSION}"
echo
echo "Architecture:"
echo
echo "  ${ARCH}"
echo
echo "Size:"
echo
echo "  ${PACKAGE_SIZE}"
echo
echo "Install:"
echo
echo "  sudo dpkg -i ${APP_NAME}_${VERSION}_${ARCH}.deb"
echo
echo "If dependencies are missing:"
echo
echo "  sudo apt install -f"
echo
echo "After installation:"
echo
echo "  file-manager status"
echo
echo "  file-manager open"
echo
echo "=========================================================="
echo

