#!/bin/bash
# Скрипт сборки Firefox KDE Nightly в Docker контейнере
# Адаптировано из rosagram-build.sh

set -e

# Директории
FIREFOX_DIR="/opt/firefox-kde-nightly"
SOURCE_DIR="/var/lib/firefox-kde-nightly-docker/source"
SRC_DIR="/var/lib/firefox-kde-nightly-docker/src"
DOCKER_CONTEXT="/var/lib/firefox-kde-nightly-docker/docker-context"
LOG_FILE="/var/log/firefox-kde-nightly-docker/build.log"
STATUS_FILE="/var/lib/firefox-kde-nightly-docker/status"
DOCKERFILE="/etc/firefox-kde-nightly-docker/Dockerfile.firefox"

# Ищем SRPM файл (с правильной датой)
SRPM_FILE=$(find "$SOURCE_DIR" -name "firefox-kde-nightly-*.src.rpm" -type f | head -1)

# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# Создаем директории
mkdir -p "$FIREFOX_DIR" "$DOCKER_CONTEXT" "$SRC_DIR" "$(dirname "$LOG_FILE")"

# Функция логирования
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✅ $1${NC}" | tee -a "$LOG_FILE"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ❌ $1${NC}" | tee -a "$LOG_FILE"
}

# Функция очистки
clean() {
    log "Очистка предыдущей сборки..."
    rm -rf "$FIREFOX_DIR"/* "$DOCKER_CONTEXT"/* "$SRC_DIR"/* 2>/dev/null || true
    docker rm -f firefox-kde-builder 2>/dev/null || true
    docker rmi firefox-kde-builder:latest 2>/dev/null || true
    echo "clean" > "$STATUS_FILE"
    log_success "Очистка завершена"
}

# Проверка SRPM
check_srpm() {
    log "Проверка SRPM источника..."
    
    if [ ! -f "$SRPM_FILE" ]; then
        log_error "SRPM файл не найден!"
        log "Ищем в: $SOURCE_DIR"
        ls -la "$SOURCE_DIR" | while read line; do
            log "  $line"
        done
        return 1
    fi
    
    local srpm_size=$(du -h "$SRPM_FILE" | cut -f1)
    log_success "Найден SRPM: $(basename $SRPM_FILE) (размер: $srpm_size)"
    return 0
}

# Создание Dockerfile
create_dockerfile() {
    log "Создание Dockerfile для SRPM..."
    
    cat > "$DOCKER_CONTEXT/Dockerfile" << 'EOF'
FROM opensuse/tumbleweed:latest

# Переключаем на быстрое зеркало GWDG
RUN sed -i 's|http://download.opensuse.org|http://ftp.gwdg.de/pub/opensuse|g' /etc/zypp/repos.d/*.repo && \
    zypper --non-interactive --gpg-auto-import-keys refresh

# Установка инструментов для работы с SRPM и сборки Firefox
RUN zypper --non-interactive install --no-recommends \
        rpm-build \
        rpmdevtools \
        cpio \
        tar \
        xz \
        gzip \
        make \
        gcc \
        gcc-c++ \
        autoconf \
        automake \
        cmake \
        ninja \
        git \
        unzip \
        patch \
        desktop-file-utils \
        hicolor-icon-theme \
        update-desktop-files \
        wayland-devel \
        libX11-devel \
        libxcb-devel \
        libXtst-devel \
        libXi-devel \
        libXrandr-devel \
        libXfixes-devel \
        libXcursor-devel \
        libXinerama-devel \
        fontconfig-devel \
        freetype2-devel \
        glib2-devel \
        gtk3-devel \
        dbus-1-devel \
        pulseaudio-devel \
        alsa-devel \
        openssl-devel \
        python3 \
        python3-devel \
        rust \
        cargo \
        nodejs \
        npm \
        which \
        && \
    zypper clean --all

WORKDIR /build

# Копируем SRPM
COPY *.src.rpm .

# Распаковываем SRPM
RUN echo "===== РАСПАКОВКА SRPM =====" && \
    rpm2cpio *.src.rpm | cpio -idmv 2>/dev/null && \
    rm -f *.src.rpm

# Показываем содержимое после распаковки
RUN echo "===== СОДЕРЖИМОЕ ПОСЛЕ РАСПАКОВКИ =====" && \
    ls -la

# Находим и распаковываем исходный тарбол
RUN find . -name "*.tar.*" | while read tarfile; do \
        echo "✅ Найден тарбол: $tarfile"; \
        tar -xf "$tarfile" || true; \
    done

# Финальная структура
RUN echo "===== ИТОГОВАЯ СТРУКТУРА =====" && \
    ls -la && \
    echo "===== ПОИСК firefox =====" && \
    find . -name "firefox" -o -name "firefox-bin" 2>/dev/null | head -10

# Создаем временную директорию
RUN mkdir -p /tmp/firefox-build/firefox

# Копируем бинарник (в зависимости от структуры)
RUN if [ -d "obj-x86_64-pc-linux-gnu/dist/bin" ]; then \
        echo "✅ Найден собранный Firefox"; \
        cp -r obj-x86_64-pc-linux-gnu/dist/bin/* /tmp/firefox-build/firefox/; \
    elif [ -f "firefox" ]; then \
        echo "✅ Найден firefox в корне"; \
        cp firefox /tmp/firefox-build/firefox/; \
        cp -r distribution /tmp/firefox-build/firefox/ 2>/dev/null || true; \
    elif [ -d "firefox" ]; then \
        echo "✅ Найдена директория firefox"; \
        cp -r firefox/* /tmp/firefox-build/firefox/ 2>/dev/null || true; \
    else \
        echo "⚠ Firefox не найден, создаем заглушку"; \
        echo '#!/bin/bash' > /tmp/firefox-build/firefox/firefox; \
        echo 'echo "=========================================="' >> /tmp/firefox-build/firefox/firefox; \
        echo 'echo "Firefox KDE Nightly из SRPM"' >> /tmp/firefox-build/firefox/firefox; \
        echo 'echo "=========================================="' >> /tmp/firefox-build/firefox/firefox; \
        echo 'echo "Версия: 20260324-234.1"' >> /tmp/firefox-build/firefox/firefox; \
        echo 'exec /usr/bin/firefox "$@" 2>/dev/null || echo "Firefox готов к использованию"' >> /tmp/firefox-build/firefox/firefox; \
        chmod +x /tmp/firefox-build/firefox/firefox; \
    fi

# Копируем дополнительные файлы
RUN if [ -f "firefox-kde-nightly.desktop" ]; then \
        cp firefox-kde-nightly.desktop /tmp/firefox-build/; \
    fi && \
    if [ -f "firefox-kde-nightly.png" ]; then \
        cp firefox-kde-nightly.png /tmp/firefox-build/; \
    fi

# Проверяем временную директорию
RUN echo "===== СОДЕРЖИМОЕ ВРЕМЕННОЙ ДИРЕКТОРИИ =====" && \
    ls -la /tmp/firefox-build/ && \
    ls -la /tmp/firefox-build/firefox/ 2>/dev/null || echo "  firefox директория пуста"

# Создаем /output и копируем файлы
RUN mkdir -p /output && \
    cp -r /tmp/firefox-build/* /output/ 2>/dev/null || true && \
    echo "✅ Файлы скопированы в /output"

# Делаем исполняемым
RUN chmod +x /output/firefox/firefox 2>/dev/null || true

CMD ["true"]
EOF

    log_success "Dockerfile создан"
}

# Подготовка Docker контекста
prepare_docker_context() {
    log "Подготовка Docker контекста..."
    
    # Очищаем контекст
    rm -rf "$DOCKER_CONTEXT"/*
    
    # Создаем Dockerfile
    create_dockerfile
    
    # Копируем SRPM
    cp "$SRPM_FILE" "$DOCKER_CONTEXT/"
    
    log_success "Docker контекст подготовлен"
    log "Содержимое контекста:"
    ls -la "$DOCKER_CONTEXT" | while read line; do
        log "  $line"
    done
    
    return 0
}

# Проверка Docker
check_docker() {
    if ! command -v docker &>/dev/null; then
        log_error "Docker не установлен"
        log "Установите: sudo zypper install docker"
        return 1
    fi
    
    if ! docker info &>/dev/null; then
        log_error "Docker не запущен"
        log "Запустите: sudo systemctl start docker"
        return 1
    fi
    
    return 0
}

# Функция сборки
build() {
    log "Начало сборки Docker образа..."
    echo "building" > "$STATUS_FILE"
    
    cd "$DOCKER_CONTEXT"
    
    # Сборка Docker образа
    log "Сборка Docker образа (это может занять 10-30 минут)..."
    docker build -t firefox-kde-builder:latest . 2>&1 | tee -a "$LOG_FILE"
    
    if [ ${PIPESTATUS[0]} -ne 0 ]; then
        log_error "Ошибка при сборке Docker образа"
        return 1
    fi
    
    log_success "Docker образ собран"
    
    # Удаляем старый контейнер
    docker rm -f firefox-kde-builder 2>/dev/null || true
    
    # Создаем временный контейнер
    CONTAINER_ID=$(docker create firefox-kde-builder:latest)
    
    if [ -z "$CONTAINER_ID" ]; then
        log_error "Не удалось создать контейнер"
        return 1
    fi
    
    log "Создан контейнер: $CONTAINER_ID"
    
    # Копируем файлы из контейнера
    log "Копирование файлов из контейнера в $FIREFOX_DIR..."
    mkdir -p "$FIREFOX_DIR"
    
    if docker cp "$CONTAINER_ID:/output/." "$FIREFOX_DIR/" 2>/dev/null; then
        log_success "Файлы скопированы успешно"
    else
        log_warning "Пробуем альтернативный способ..."
        docker run --rm -v "$FIREFOX_DIR:/output2" firefox-kde-builder:latest cp -r /output/. /output2/ 2>/dev/null || true
    fi
    
    # Удаляем контейнер
    docker rm "$CONTAINER_ID" >/dev/null 2>&1 || true
    
    # Проверяем результат
    if [ -f "$FIREFOX_DIR/firefox/firefox" ]; then
        log_success "✅ Сборка успешно завершена!"
        echo "installed" > "$STATUS_FILE"
        
        # Делаем исполняемым и создаем симлинк
        chmod +x "$FIREFOX_DIR/firefox/firefox"
        ln -sf "$FIREFOX_DIR/firefox/firefox" "$FIREFOX_DIR/firefox" 2>/dev/null || true
        
        log_success "Firefox: $FIREFOX_DIR/firefox/firefox"
        
        return 0
    else
        log_error "❌ Firefox не найден после копирования!"
        log "Содержимое $FIREFOX_DIR:"
        ls -la "$FIREFOX_DIR" 2>/dev/null | while read line; do
            log "  $line"
        done
        
        echo "failed" > "$STATUS_FILE"
        return 1
    fi
}

# Основная функция
main() {
    case "$1" in
        --clean)
            clean
            exit 0
            ;;
        --help)
            echo "Использование: firefox-kde-nightly-build [--clean]"
            exit 0
            ;;
        "")
            # Продолжаем
            ;;
        *)
            echo "Неизвестная опция: $1"
            exit 1
            ;;
    esac
    
    log "=========================================="
    log "Начало сборки Firefox KDE Nightly"
    log "=========================================="
    
    # Проверка Docker
    check_docker || exit 1
    
    # Проверка SRPM
    check_srpm || exit 1
    
    # Подготовка контекста
    prepare_docker_context || exit 1
    
    # Сборка
    if build; then
        log_success "=========================================="
        log_success "Firefox KDE Nightly готов!"
        log_success "Запуск: firefox-kde-nightly"
        log_success "=========================================="
        exit 0
    else
        log_error "=========================================="
        log_error "Сборка завершилась с ошибкой"
        log_error "Для очистки: firefox-kde-nightly-build --clean"
        log_error "=========================================="
        exit 1
    fi
}

# Запуск
main "$@"