#!/usr/bin/env raku
use Terminal::Capabilities::Summarize;

constant BOLD_YELLOW = "\e[1;33m";
constant RESET       = "\e[0m";

# Determine if any environment variables are set
sub has-a-var(@vars) {
    ?@vars.first({ %*ENV{$_}:exists })
}


# Display a section of detected environment variables
sub section($section, @vars) {
    if has-a-var(@vars) {
        put BOLD_YELLOW ~ $section ~ RESET;
        printf("%-22s  %s\n", $_, %*ENV{$_} // '') for @vars;
        put '';
    }
    else {
        my $pad = 0 max 24 - $section.chars;
        put BOLD_YELLOW ~ $section ~ RESET ~ ' ' x $pad ~ '[none found]';
    }
}


# Show current values of all known terminal-related environment variables
sub show-env(Bool $verbose) {
    my @term-vars =
        # Used by many terminals
        'General'     => < LANG TERM COLORTERM COLORFGBG TERM_PROGRAM TERM_PROGRAM_VERSION >,
        'macOS'       => < __CF_USER_TEXT_ENCODING __CFBundleIdentifier COMMAND_MODE TERM_SESSION_ID >,

        # Terminal-specific
        'Alacritty'   => < ALACRITTY_WINDOW_ID ALACRITTY_LOG ALACRITTY_SOCKET >,
        'CRT'         => < COLORSCHEMES_DIR KB_LAYOUT_DIR >,
        'Ghostty'     => < GHOSTTY_BIN_DIR GHOSTTY_RESOURCES_DIR GHOSTTY_SHELL_FEATURES GHOSTTY_SHELL_INTEGRATION_NO_SUDO GHOSTTY_QUICK_TERMINAL >,
        'iTerm'       => < ITERM_PROFILE ITERM_SESSION_ID LC_TERMINAL LC_TERMINAL_VERSION TERM_FEATURES TERMINFO_DIRS >,
        'kitty'       => < KITTY_WINDOW_ID KITTY_PID KITTY_PUBLIC_KEY KITTY_INSTALLATION_DIR >,
        'Konsole'     => < KONSOLE_VERSION KONSOLE_DBUS_SERVICE KONSOLE_DBUS_SESSION KONSOLE_DBUS_WINDOW >,
        'MLTerm'      => [ 'MLTERM', ],
        'Qt'          => < D_DISABLE_RT_SCREEN_SCALE QT_SCALE_FACTOR_ROUNDING_POLICY >,
        'screen'      => < STY WINDOW TERMCAP >,
        'Tabby'       => < MallocNanoZone NODE_PATH TABBY_CONFIG_DIRECTORY TABBY_PLUGINS >,
        'Terminator'  => < TERMINATOR_DBUS_NAME TERMINATOR_DBUS_PATH TERMINATOR_UUID >,
        'Terminology' => < TERMINOLOGY XTERM_256_COLORS >,
        'tmux'        => < TMUX TMUX_PANE >,
        'VTE'         => < VTE_VERSION TILIX_ID GNOME_TERMINAL_SERVICE GNOME_TERMINAL_SCREEN >,
        'WezTerm'     => < WEZTERM_EXECUTABLE_DIR WEZTERM_EXECUTABLE WEZTERM_PANE WEZTERM_UNIX_SOCKET >,
        'Windows Terminal' => < WT_SESSION WT_PROFILE_ID >,
        'Xterm'       => < XTERM_VERSION XTERM_SHELL XTERM_LOCALE >,
        'Zellij'      => < ZELLIJ ZELLIJ_PANE_ID ZELLIJ_SESSION_NAME >,
        'Zutty'       => [ 'ZUTTY_VERSION', ],
    ;

    my %split = @term-vars.classify({ has-a-var(.value) });
    section(.key, .value) for @(%split{True});

    if $verbose {
        section(.key, .value) for @(%split{False});
        put '' if %split{False};
    }
}


#| Show autodetected terminal capabilities
sub MAIN(Bool :$show-env,  #= Show known terminal-related environment values also
         Bool :$verbose,   #= Show detection results in verbose form
        ) {
    if $show-env {
        show-env($verbose);
        put BOLD_YELLOW ~ 'Detected' ~ RESET;
    }

    my ($caps, $terminal, $version, $summary) = summarize-autodetection;
    if $verbose {
        put "Terminal: {$terminal // 'unknown'}";
        put "Version:  {$version  // 'unknown'}";
        put 'Caps:';

        for < symbol-set vt100-boxes half-blocks
              braille quadrants sextants octants
              sep-quadrants sep-sextants
              bold faint italic inverse
              strike overline underline dunderline
              color3bit  colorbright color8bit color24bit
              emoji-text emoji-color emoji-skin
              emoji-iso  emoji-reg   emoji-zwj > {
            printf "  %-13s  %s\n", $_, $caps."$_"();
        }
    }
    else {
        put $summary;
    }
}
