#!/usr/bin/bash
# haruna-builder – установщик haruna из исходников на Fedora
# Автор: Sylar
# Версия: 1.3

set -e

# Цвета
if [ -t 1 ]; then
    GREEN='\033[0;32m'; BLUE='\033[0;34m'; RED='\033[0;31m'; YELLOW='\033[1;33m'; NC='\033[0m'
else
    GREEN=''; BLUE=''; RED=''; YELLOW=''; NC=''
fi

info() { echo -e "${BLUE}➡${NC} $1"; }
success() { echo -e "${GREEN}✅${NC} $1"; }
error() { echo -e "${RED}❌${NC} $1"; }
warn() { echo -e "${YELLOW}⚠${NC} $1"; }
step() { echo -e "\n${BLUE}=== $1 ===${NC}"; }

CONFIG_FILE="/etc/haruna-builder.conf"
DEFAULT_VERSION="1.8.1"
DEFAULT_URL="https://download.kde.org/stable/haruna/${DEFAULT_VERSION}/haruna-${DEFAULT_VERSION}.tar.xz"
WORK_DIR="/tmp/haruna-builder-$$"
RPM_BACKUP="/tmp/haruna-latest.rpm"
DEPS_LOG="/var/log/haruna-builder-installed-deps.log"

cleanup() {
    if [ -d "$WORK_DIR" ]; then
        rm -rf "$WORK_DIR"
        info "Временные файлы удалены: $WORK_DIR"
    fi
}
trap cleanup EXIT

get_config() {
    if [ -f "$CONFIG_FILE" ]; then
        VERSION=$(grep -E '^[[:space:]]*version[[:space:]]*=' "$CONFIG_FILE" | head -1 | sed -E 's/^[[:space:]]*version[[:space:]]*=[[:space:]]*//' | tr -d ' ')
        URL=$(grep -E '^[[:space:]]*url[[:space:]]*=' "$CONFIG_FILE" | head -1 | sed -E 's/^[[:space:]]*url[[:space:]]*=[[:space:]]*//' | tr -d ' ')
    fi
    VERSION="${VERSION:-$DEFAULT_VERSION}"
    URL="${URL:-$DEFAULT_URL}"
    if [[ "$URL" != *"$VERSION"* ]]; then
        URL="https://download.kde.org/stable/haruna/${VERSION}/haruna-${VERSION}.tar.xz"
    fi
    echo "$VERSION|$URL"
}

check_deps() {
    local deps=("curl" "rpmbuild" "tar" "gcc-c++" "cmake" "make" "extra-cmake-modules" "desktop-file-utils" "appstream-util")
    local missing=()
    for dep in "${deps[@]}"; do
        if ! command -v "$dep" &>/dev/null; then
            missing+=("$dep")
        fi
    done
    if [ ${#missing[@]} -ne 0 ]; then
        error "Отсутствуют программы: ${missing[*]}"
        sudo dnf install -y "${missing[@]}"
    fi
}

generate_spec() {
    local version="$1"
    local changelog_date=$(LC_TIME=C date "+%a %b %d %Y")
    cat > "$WORK_DIR/SPECS/haruna.spec" << EOF
Name:           haruna
Version:        ${version}
Release:        1%{?dist}
Summary:        Open source video player built with Qt/QML and libmpv
License:        BSD-3-Clause AND CC-BY-4.0 AND CC-BY-SA-4.0 AND GPL-2.0-or-later AND GPL-3.0-or-later AND MIT
URL:            https://invent.kde.org/multimedia/haruna/

Source0:        haruna-${version}.tar.xz
BuildArch:      x86_64

BuildRequires:  cmake
BuildRequires:  gcc-c++
BuildRequires:  gettext
BuildRequires:  kf6-rpm-macros
BuildRequires:  extra-cmake-modules
BuildRequires:  desktop-file-utils
BuildRequires:  libappstream-glib
BuildRequires:  cmake(MpvQt)
BuildRequires:  cmake(Qt6Core) cmake(Qt6DBus) cmake(Qt6Gui) cmake(Qt6Qml) cmake(Qt6Quick) cmake(Qt6QuickControls2) cmake(Qt6Core5Compat) cmake(Qt6ShaderTools)
BuildRequires:  cmake(KF6ColorScheme) cmake(KF6Config) cmake(KF6CoreAddons) cmake(KF6Crash) cmake(KF6DocTools) cmake(KF6FileMetaData) cmake(KF6I18n) cmake(KF6IconThemes) cmake(KF6KIO) cmake(KF6Kirigami) cmake(KF6WindowSystem)
BuildRequires:  cmake(Breeze) cmake(KDSingleApplication-qt6)
BuildRequires:  pkgconfig(mpv) pkgconfig(libavcodec) pkgconfig(libavdevice) pkgconfig(libavfilter) pkgconfig(libavformat) pkgconfig(libavutil) pkgconfig(libswresample) pkgconfig(libswscale)

Requires:       kde-filesystem
Requires:       hicolor-icon-theme
Requires:       kf6-kirigami%{?_isa}
Requires:       kf6-kitemmodels%{?_isa}
Requires:       kf6-qqc2-desktop-style%{?_isa}
Recommends:     yt-dlp

%description
Open source video player built with Qt/QML and libmpv.

%prep
%autosetup -p1

%build
%cmake_kf6
%cmake_build

%install
%cmake_install
for i in 44 150 310; do
  rm -rf %{buildroot}%{_kf6_datadir}/icons/hicolor/"\${i}x\${i}"
done
%find_lang %{name} --with-html

%check
desktop-file-validate %{buildroot}%{_kf6_datadir}/applications/org.kde.%{name}.desktop
appstream-util validate-relax --nonet %{buildroot}%{_kf6_metainfodir}/org.kde.%{name}.metainfo.xml

%files -f %{name}.lang
%doc README.md
%license LICENSES/*.txt
%{_kf6_bindir}/haruna
%{_kf6_datadir}/applications/org.kde.%{name}.desktop
%{_kf6_datadir}/icons/hicolor/*/apps/haruna.{svg,png}
%{_kf6_metainfodir}/org.kde.%{name}.metainfo.xml

%changelog
* ${changelog_date} Sylar <renard.corp@hotmail.com> - ${version}-1
- Automated build from source
EOF
    success "SPEC-файл сгенерирован (версия ${version})"
}

do_install() {
    step "Начало сборки и установки haruna"
    check_deps
    IFS='|' read -r VERSION URL < <(get_config)
    info "Версия: $VERSION"
    info "URL исходников: $URL"
    
    mkdir -p "$WORK_DIR"/{SOURCES,SPECS,RPMS,BUILD,BUILDROOT}
    
    step "Скачивание исходников"
    pushd "$WORK_DIR/SOURCES" >/dev/null
    if [ -f "haruna-${VERSION}.tar.xz" ]; then
        info "Файл уже есть, пропускаем загрузку"
    else
        curl -L --progress-bar -o "haruna-${VERSION}.tar.xz" "$URL"
    fi
    popd >/dev/null
    success "Исходные коды загружены"
    
    step "Генерация SPEC-файла"
    generate_spec "$VERSION"
    
    # Автоматическая установка всех зависимостей сборки
    step "Установка зависимостей сборки (BuildRequires)"
    # Включаем source-репозитории и отключаем проблемные сторонние репозитории
    sudo dnf config-manager --set-enabled fedora-source updates-source || true
    # Логируем установленные пакеты до установки зависимостей
    rpm -qa --queryformat "%{NAME}\n" | sort > /tmp/deps-before.txt
    sudo dnf builddep --disablerepo='home_slyfox*' -y "$WORK_DIR/SPECS/haruna.spec" || {
        warn "Не удалось автоматически установить все зависимости, продолжаем..."
    }
    # Логируем установленные пакеты после и сохраняем разницу
    rpm -qa --queryformat "%{NAME}\n" | sort > /tmp/deps-after.txt
    comm -13 /tmp/deps-before.txt /tmp/deps-after.txt | sudo tee "$DEPS_LOG" > /dev/null
    info "Список установленных зависимостей сохранён в $DEPS_LOG"
    rm -f /tmp/deps-before.txt /tmp/deps-after.txt
    
    step "Сборка RPM"
    LOG_FILE="/var/log/haruna-builder.log"
    if rpmbuild -ba --define "_topdir $WORK_DIR" "$WORK_DIR/SPECS/haruna.spec" > "$LOG_FILE" 2>&1; then
        success "RPM собран успешно."
    else
        error "Ошибка сборки. Лог: $LOG_FILE"
        tail -50 "$LOG_FILE"
        exit 1
    fi
    
    RPM_FILE=$(find "$WORK_DIR/RPMS/x86_64/" -name "haruna-${VERSION}-*.rpm" | head -1)
    if [ -z "$RPM_FILE" ]; then
        error "RPM не найден."
        exit 1
    fi
    info "RPM: $(basename "$RPM_FILE")"
    
    cp "$RPM_FILE" "$RPM_BACKUP"
    cp "$RPM_FILE" "$HOME/haruna-latest.rpm"
    info "Резервная копия: $RPM_BACKUP и $HOME/haruna-latest.rpm"
    
    step "Установка haruna"
    if sudo dnf install --disablerepo='home_slyfox*' -y "$RPM_FILE"; then
        success "haruna успешно установлен!"
        info "Запустите 'haruna'."
        echo
        echo -e "${YELLOW}Для очистки системы от временных пакетов разработки выполните:${NC}"
        echo "  sudo haruna-builder cleanup"
        echo "  или вручную: sudo dnf autoremove"
        echo "Список установленных зависимостей (для справки): $DEPS_LOG"
    else
        error "Ошибка при установке. Вы можете установить RPM вручную:"
        echo "  sudo dnf install --disablerepo='home_slyfox*' $RPM_BACKUP"
        exit 1
    fi
}

do_cleanup() {
    step "Очистка временных файлов и неиспользуемых зависимостей"
    rm -rf /tmp/haruna-builder-*
    success "Временные файлы удалены."
    
    if [ -f "$DEPS_LOG" ]; then
        echo
        warn "Найдены сохранённые зависимости сборки:"
        cat "$DEPS_LOG"
        echo
        read -p "Желаете удалить эти пакеты? (y/N): " -r
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            sudo dnf remove -y $(cat "$DEPS_LOG") || warn "Некоторые пакеты не удалены (могут быть нужны другим приложениям)"
            sudo dnf autoremove -y
            sudo rm -f "$DEPS_LOG"
            success "Пакеты разработки удалены."
        else
            info "Удаление отменено. Вы можете удалить пакеты вручную командой: sudo dnf remove $(cat "$DEPS_LOG")"
        fi
    else
        info "Файл с зависимостями не найден. Попробуйте выполнить 'sudo dnf autoremove'"
    fi
}

case "$1" in
    start)   do_install ;;
    clean)   rm -rf /tmp/haruna-builder-*; success "Временные файлы очищены." ;;
    cleanup) do_cleanup ;;
    version) echo "haruna-builder version 1.3 (Sylar)" ;;
    help|--help|-h)
        echo "Использование: haruna-builder [start|clean|cleanup|version|help]"
        echo "  start   - загрузить исходники, собрать RPM и установить haruna"
        echo "  clean   - удалить только временные файлы сборки"
        echo "  cleanup - удалить временные файлы и предложить удалить зависимости сборки"
        echo "  version - показать версию утилиты"
        ;;
    *)
        echo "Неизвестная команда: $1"
        echo "Запустите 'haruna-builder help' для справки."
        exit 1
        ;;
esac