package tui import ( "fmt" "log" "log/slog" "system_setup_tool/internal/config" "system_setup_tool/internal/dotfiles" "system_setup_tool/internal/utils" pm "system_setup_tool/pkg/packagemanager" "github.com/charmbracelet/huh" "github.com/mitchellh/mapstructure" "github.com/spf13/cobra" "github.com/spf13/viper" ) type installedPkgMsg string func Run(cmd *cobra.Command, args []string) { sudoPassword, err := utils.GetSudoPassword() if err != nil { log.Fatal(err) } var cfg config.Config if err := viper.Unmarshal(&cfg); err != nil { log.Fatalf("Fehler beim Lesen der Konfiguration: %v", err) } for name, config := range cfg.PackageManagers { if config.Enable { var manager pm.PackageManager switch name { case "os": manager = pm.NewOSManager(sudoPassword) case "homebrew": manager = &pm.HomebrewManager{} case "go": manager = &pm.GolangManager{} case "cargo": manager = &pm.CargoManager{} case "pipx": manager = &pm.PipxManager{} case "flatpak": flatpakConfig := pm.FlatpakConfig{} if err := mapstructure.Decode(config, &flatpakConfig); err != nil { log.Printf("error decoding flatpak config: %v", err) continue } manager = pm.NewFlatpakManager(sudoPassword, flatpakConfig) default: slog.Warn(fmt.Sprintf("unknown packagemanager: %s", name)) continue } if err := manager.InstallManager(); err != nil { slog.Warn(fmt.Sprintf("packagemanager %s not installed and could not be installed: %v", manager.Name(), err)) } if err := manager.Install(config.Packages); err != nil { slog.Warn(fmt.Sprintf("warning at %s-packages: %v", manager.Name(), err)) } } } osManager := pm.NewOSManager(sudoPassword) var installBuild bool form := huh.NewForm( huh.NewGroup( huh.NewConfirm(). Title("Möchten Sie die Build Essentials installieren?"). Value(&installBuild), ), ).WithTheme(huh.ThemeCatppuccin()) err = form.Run() if err != nil { log.Fatal(err) } if installBuild { if err := osManager.InstallBuildEssentials(); err != nil { log.Printf("Warnung: %v", err) } } if cfg.Dotfiles.Enable { fmt.Println("\nconfiguring dotfiles...") if err := dotfiles.SetupDotfiles(cfg.Dotfiles); err != nil { log.Printf("Warnung bei Dotfiles-Setup: %v", err) } } }