package com.radiola.util

import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import com.radiola.ui.theme.ThemePalette
import dagger.hilt.android.qualifiers.ApplicationContext
import javax.inject.Inject
import javax.inject.Singleton

/**
 * Переключает иконку лаунчера под выбранную цветовую тему. Реализовано через
 * activity-alias в манифесте (по одному на тему): включаем alias выбранной темы и
 * выключаем остальные — ровно ОДИН активен всегда (иначе приложение пропадёт с
 * рабочего стола). На части лаунчеров/ColorOS иконка обновляется с задержкой —
 * это особенность системы, не баг.
 */
@Singleton
class LauncherIconManager @Inject constructor(
    @ApplicationContext private val context: Context
) {
    private fun aliasSuffix(p: ThemePalette) = when (p) {
        ThemePalette.FOREST -> "Forest"
        ThemePalette.OCEAN -> "Ocean"
        ThemePalette.SUNSET -> "Sunset"
        ThemePalette.AMETHYST -> "Amethyst"
        ThemePalette.NEON -> "Neon"
        ThemePalette.AMBER -> "Amber"
        ThemePalette.ICE -> "Ice"
        ThemePalette.ROSE -> "Rose"
    }

    private fun component(p: ThemePalette) =
        ComponentName(context.packageName, "${context.packageName}.MainAlias${aliasSuffix(p)}")

    /** Меняет иконку только если она ещё не соответствует теме (без лишних миганий). */
    fun applyIfNeeded(palette: ThemePalette) {
        val prefs = context.getSharedPreferences("radiola_prefs", Context.MODE_PRIVATE)
        // Дефолт манифеста — forest (его alias enabled=true).
        if (prefs.getString("icon_alias", "forest") == palette.id) return
        apply(palette)
        prefs.edit().putString("icon_alias", palette.id).apply()
    }

    private fun apply(palette: ThemePalette) {
        val pm = context.packageManager
        // Сначала включаем нужный — чтобы ни на миг не остаться без launcher-иконки.
        runCatching {
            pm.setComponentEnabledSetting(
                component(palette),
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP
            )
        }
        for (p in ThemePalette.entries) {
            if (p == palette) continue
            runCatching {
                pm.setComponentEnabledSetting(
                    component(p),
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP
                )
            }
        }
    }
}
