package tui

import (
	"strings"

	"github.com/AvengeMedia/danklinux/internal/deps"
	tea "github.com/charmbracelet/bubbletea"
)

func (m Model) viewMissingWMInstructions() string {
	var b strings.Builder

	b.WriteString(m.renderBanner())
	b.WriteString("\n\n")

	// Determine which WM is missing
	wmName := "Niri"
	installCmd := `environment.systemPackages = with pkgs; [
  niri
];`
	alternateCmd := `# Or enable the module if available:
# programs.niri.enable = true;`

	if m.selectedWM == 1 {
		wmName = "Hyprland"
		installCmd = `programs.hyprland.enable = true;`
		alternateCmd = `# Or add to systemPackages:
# environment.systemPackages = with pkgs; [
#   hyprland
# ];`
	}

	// Title
	title := m.styles.Title.Render("⚠️  " + wmName + " Not Installed")
	b.WriteString(title)
	b.WriteString("\n\n")

	// Explanation
	explanation := m.styles.Normal.Render(wmName + " needs to be installed system-wide on NixOS.")
	b.WriteString(explanation)
	b.WriteString("\n\n")

	// Instructions
	instructions := m.styles.Subtle.Render("To install " + wmName + ", add this to your /etc/nixos/configuration.nix:")
	b.WriteString(instructions)
	b.WriteString("\n\n")

	// Command box
	cmdBox := m.styles.CodeBlock.Render(installCmd)
	b.WriteString(cmdBox)
	b.WriteString("\n\n")

	// Alternate command
	altBox := m.styles.Subtle.Render(alternateCmd)
	b.WriteString(altBox)
	b.WriteString("\n\n")

	// Rebuild instruction
	rebuildInstruction := m.styles.Normal.Render("Then rebuild your system:")
	b.WriteString(rebuildInstruction)
	b.WriteString("\n")

	rebuildCmd := m.styles.CodeBlock.Render("sudo nixos-rebuild switch")
	b.WriteString(rebuildCmd)
	b.WriteString("\n\n")

	// Navigation help
	help := m.styles.Subtle.Render("Press Esc to go back and select a different window manager, or Ctrl+C to exit")
	b.WriteString(help)

	return b.String()
}

func (m Model) updateMissingWMInstructionsState(msg tea.Msg) (tea.Model, tea.Cmd) {
	if keyMsg, ok := msg.(tea.KeyMsg); ok {
		switch keyMsg.String() {
		case "esc":
			// Go back to window manager selection
			m.state = StateSelectWindowManager
			return m, m.listenForLogs()
		case "ctrl+c":
			return m, tea.Quit
		}
	}
	return m, m.listenForLogs()
}

func (m Model) getSelectedWM() deps.WindowManager {
	if m.selectedWM == 0 {
		return deps.WindowManagerNiri
	}
	return deps.WindowManagerHyprland
}
