#!/bin/bash
# ==============================================================================
# Скрипт автоматической настройки USB-принтера Ricoh в ALT Linux
# Поддерживает модели Ricoh SP 212Nw, SP 212w, SP 213Nw и совместимые
# ==============================================================================

set -o pipefail

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

PRINTER_QUEUE_NAME="RICOH_SP_212Nw"
DEFAULT_PAGE_SIZE="A4"

log_info() {
    echo -e "${BLUE}[ИНФО]${NC} $1"
}

log_ok() {
    echo -e "${GREEN}[УСПЕХ]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[ВНИМАНИЕ]${NC} $1"
}

log_error() {
    echo -e "${RED}[ОШИБКА]${NC} $1"
}

header() {
    echo -e "\n${BOLD}${CYAN}=== $1 ===${NC}\n"
}

# 1. Проверка прав суперпользователя (root)
check_root() {
    if [ "$EUID" -ne 0 ]; then
        log_error "Данный скрипт должен быть запущен с правами суперпользователя (root)."
        echo "Запустите: su - или sudo $0"
        exit 1
    fi
}

# 2. Проверка и запуск службы CUPS
check_cups_service() {
    header "1. Проверка службы печати CUPS"
    
    if ! systemctl is-active --quiet cups; then
        log_info "Запуск службы CUPS..."
        systemctl start cups || {
            log_error "Не удалось запустить CUPS. Проверьте: systemctl status cups"
            exit 1
        }
    fi
    
    systemctl enable cups >/dev/null 2>&1
    log_ok "Служба CUPS активна."
}

# 3. Поиск физически подключенного USB-принтера Ricoh
detect_usb_printer() {
    header "2. Поиск подключенного USB-принтера Ricoh"
    
    local lsusb_match
    lsusb_match=$(lsusb 2>/dev/null | grep -i "Ricoh" || true)
    if [ -n "$lsusb_match" ]; then
        log_ok "Найдено USB-устройство Ricoh:"
        echo "       $lsusb_match"
    fi

    local backend_output
    backend_output=$(/usr/lib/cups/backend/usb 2>/dev/null || true)
    
    DEVICE_URI=""
    MODEL_DETECTED=""
    
    while IFS= read -r line; do
        if echo "$line" | grep -iq "RICOH"; then
            DEVICE_URI=$(echo "$line" | awk '{print $2}')
            MODEL_DETECTED=$(echo "$line" | sed -n 's/.*"\(RICOH[^"]*\)".*/\1/p' | head -n1)
            break
        fi
    done <<< "$backend_output"

    if [ -z "$DEVICE_URI" ]; then
        local lpinfo_output
        lpinfo_output=$(lpinfo -v 2>/dev/null | grep -i "usb://RICOH" | head -n1 || true)
        if [ -n "$lpinfo_output" ]; then
            DEVICE_URI=$(echo "$lpinfo_output" | awk '{print $2}')
        fi
    fi

    if [ -z "$DEVICE_URI" ]; then
        log_error "USB-принтер Ricoh не найден в системе."
        echo -e "Рекомендации:\n - Проверьте питание принтера;\n - Проверьте подключение USB-кабеля к компьютеру."
        exit 1
    fi

    log_ok "Принтер обнаружен:"
    echo "       Модель: ${MODEL_DETECTED:-Ricoh USB Printer}"
    echo "       URI: $DEVICE_URI"
}

# 4. Проверка системных пакетов
check_dependencies() {
    header "3. Проверка компонентов печати"

    local missing_pkg=0
    for cmd in gs foomatic-rip python3; do
        if ! command -v "$cmd" >/dev/null 2>&1; then
            log_error "Не найдена утилита: $cmd"
            missing_pkg=1
        fi
    done

    if [ "$missing_pkg" -eq 1 ]; then
        log_info "Установка необходимых пакетов..."
        apt-get update && apt-get install -y cups cups-filters foomatic-db-engine ghostscript python3 || {
            log_error "Ошибка при установке пакетов."
            exit 1
        }
    else
        log_ok "Все необходимые системные компоненты установлены."
    fi
}

# 5. Настройка прав доступа к USB-устройству
fix_quirks() {
    header "4. Настройка прав доступа USB"

    local udev_file="/etc/udev/rules.d/99-ricoh-printer.rules"
    if [ ! -f "$udev_file" ]; then
        cat << 'QUIRK_EOF' > "$udev_file"
# udev rule for RICOH USB Printers
SUBSYSTEM=="usb", ATTR{idVendor}=="05ca", ATTR{idProduct}=="0450", MODE="0664", GROUP="lp"
QUIRK_EOF
        udevadm control --reload-rules 2>/dev/null || true
        udevadm trigger 2>/dev/null || true
        log_ok "Правило udev создано: $udev_file"
    else
        log_ok "Правило udev настроено."
    fi
}

# 6. Подготовка PPD-драйвера PCL 5e (полностью автономный, встроен в скрипт)
prepare_pcl5_ppd() {
    header "5. Подготовка PPD-драйвера PCL 5e"

    PCL5_PPD_DIR="/etc/cups/custom-ppd"
    PCL5_PPD_FILE="$PCL5_PPD_DIR/Ricoh-SP_212Nw_PCL5e.ppd"
    mkdir -p "$PCL5_PPD_DIR"

    python3 - << 'PY_EOF'
import base64, zlib

b64_data = """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"""
ppd_data = zlib.decompress(base64.b64decode(b64_data))
with open('/etc/cups/custom-ppd/Ricoh-SP_212Nw_PCL5e.ppd', 'wb') as f:
    f.write(ppd_data)
PY_EOF

    if [ $? -eq 0 ] && [ -f "$PCL5_PPD_FILE" ]; then
        log_ok "Драйвер подготовлен: $PCL5_PPD_FILE"
    else
        log_error "Не удалось сформировать PPD-файл."
        exit 1
    fi
}

# 7. Настройка очереди печати в CUPS
setup_printer_queue() {
    header "6. Настройка очереди печати CUPS"

    log_info "Регистрация принтера '$PRINTER_QUEUE_NAME'..."
    
    lpadmin -p "$PRINTER_QUEUE_NAME" -E \
            -v "$DEVICE_URI" \
            -P "$PCL5_PPD_FILE" \
            -D "RICOH SP 212Nw Laser Printer" \
            -L "USB Local" || {
        log_error "Ошибка выполнения lpadmin."
        exit 1
    }

    # Включение принтера и разрешение приема заданий
    cupsenable "$PRINTER_QUEUE_NAME" 2>/dev/null || true
    cupsaccept "$PRINTER_QUEUE_NAME" 2>/dev/null || true

    # Назначение принтером по умолчанию
    lpadmin -d "$PRINTER_QUEUE_NAME"
    log_ok "Принтер '$PRINTER_QUEUE_NAME' назначен принтером по умолчанию."

    # Установка формата бумаги A4 и разрешения 600x600 dpi
    lpadmin -p "$PRINTER_QUEUE_NAME" -o PageSize="$DEFAULT_PAGE_SIZE" -o Resolution="600x600dpi"
    log_ok "Установлены параметры: формат $DEFAULT_PAGE_SIZE, разрешение 600x600 DPI."
    
    systemctl restart cups
}

# 8. Проверка состояния принтера
verify_status() {
    header "7. Проверка состояния принтера"
    
    local printer_status
    printer_status=$(lpstat -p "$PRINTER_QUEUE_NAME" 2>&1)
    echo "Статус очереди:"
    echo "  $printer_status"

    local default_dest
    default_dest=$(lpstat -d 2>&1)
    echo "  $default_dest"

    if echo "$printer_status" | grep -q "idle\|printing"; then
        log_ok "Принтер готов к работе."
    else
        log_warn "Принтер настроен, статус: $printer_status"
    fi
}

# 9. Инструкция пользователю
show_completion() {
    echo -e "\n${BOLD}${GREEN}================================================================${NC}"
    echo -e "${BOLD}${GREEN}        НАСТРОЙКА ПРИНТЕРА RICOH ЗАВЕРШЕНА                      ${NC}"
    echo -e "${BOLD}${GREEN}================================================================${NC}"
    echo -e "Имя принтера:       ${BOLD}$PRINTER_QUEUE_NAME${NC}"
    echo -e "Драйвер:            ${BOLD}PCL 5e (ljet4)${NC}"
    echo -e "Формат бумаги:      ${BOLD}$DEFAULT_PAGE_SIZE (600x600 DPI)${NC}"
    echo -e "Команда печати:     ${CYAN}lp -d $PRINTER_QUEUE_NAME <файл>${NC}"
    echo -e "Тестовая печать:    ${CYAN}echo 'Проверка печати' | lp${NC}"
    echo -e "Web-интерфейс CUPS: ${CYAN}http://localhost:631/printers/$PRINTER_QUEUE_NAME${NC}"
    echo -e "================================================================\n"
}

# Основной поток выполнения
check_root
check_cups_service
detect_usb_printer
check_dependencies
fix_quirks
prepare_pcl5_ppd
setup_printer_queue
verify_status
show_completion
