<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="using:DodoSSH.Client.Shell.ViewModels"
             x:Class="DodoSSH.Client.App.Views.TerminalTabs"
             x:DataType="vm:MainWindowViewModel">

  <!--
    The tab strip, above every screen.

    Every tab is one pane in the one WebView, so switching is a single frame telling the page which pane to
    show — nothing is created, nothing is destroyed, and the shell behind a hidden pane goes on running and
    goes on producing output. That is what makes tabs cost almost nothing here, and it is also why closing
    one is the only thing in this application that deliberately ends a session.

    It spans the whole window rather than the hosts screen, which is what the strip is for: a connection you
    opened stays visible and one click away while you are looking at a transfer, a key, or preferences.
    Clicking a tab switches the window's surface to that terminal — see MainWindowViewModel.ShellSurface.

    Two of the design's header controls are still absent: SPLIT and FORWARDS. Splits would need a second
    pane geometry the renderer does not have, and port forwarding does not exist in the SSH layer. Two
    disabled buttons would teach nobody anything; see docs/design-import-gaps.md.

    An ItemsControl of buttons rather than a TabStrip, because the selection lives on the shell — a tab
    outlives the vault that opened it — and a strip that owned its own selection would be a second copy of
    that state.
  -->

  <Border Height="34" Background="{StaticResource Chrome}"
          BorderBrush="{StaticResource Border}" BorderThickness="0,0,0,1">

    <!--
      Everything in one scrolling row: the tabs, then the button that opens another, then the sentence for
      when there are none. The strip stays rather than collapsing — a row of chrome that appears and
      disappears would move every screen up and down by 34 pixels each time the last tab closed.
    -->
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
      <StackPanel Orientation="Horizontal">

        <ItemsControl ItemsSource="{Binding Tabs}">
          <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
              <StackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
          </ItemsControl.ItemsPanel>
          <ItemsControl.ItemTemplate>
            <DataTemplate x:DataType="vm:TerminalTabViewModel">

              <!--
                The close box is inside the tab, not beside it. Beside it, the two were siblings in a grid:
                the cross was as tall as the strip and sat outside the tab's own background, so it read as a
                divider between tabs rather than as part of one, and the tab it belonged to was ambiguous
                for the tab to its right.

                Nested buttons work, and it is worth knowing why rather than assuming. Avalonia's
                Button.OnPointerPressed checks IsLeftButtonPressed, takes the pointer capture and marks the
                event handled — so a left press on the cross does not also select the tab. It deliberately
                does not handle any other button, which is exactly what lets a middle press bubble out of
                the cross and reach the handler below.

                Marked active on IsShowing rather than on IsSelected, which are not the same question. The
                selection survives navigating away — that is what makes the strip a way back to a terminal —
                so a tab lit while preferences filled the window would be a second "you are here" mark
                pointing at something nobody can see. See TerminalTabViewModel.IsShowing.
              -->
              <Button Classes="flat tab"
                      Classes.active="{Binding IsShowing}"
                      Command="{Binding $parent[ItemsControl].((vm:MainWindowViewModel)DataContext).SelectTabCommand}"
                      CommandParameter="{Binding}"
                      PointerPressed="OnTabPointerPressed"
                      ToolTip.Tip="{Binding Address}">
                <StackPanel Orientation="Horizontal" Spacing="7" VerticalAlignment="Center">
                  <!--
                    Green while the shell behind this tab is running, grey while it is connecting and once
                    it has ended. The pane keeps its scrollback either way, which is usually why somebody is
                    still looking at a tab whose dot has gone out.
                  -->
                  <Ellipse Classes="dot" Width="5" Height="5" Classes.live="{Binding IsLive}"
                           VerticalAlignment="Center" />
                  <TextBlock Text="{Binding Label}" VerticalAlignment="Center" />

                  <!--
                    What a tab with no pane has to say for itself: "connecting…" while the handshake runs,
                    and the refusal once one has failed. It is here rather than only on the card because the
                    whole point of not blocking the window is that the user is somewhere else — the strip is
                    the one piece of chrome that is on screen wherever that is.
                  -->
                  <TextBlock Text="{Binding Status}" VerticalAlignment="Center" FontSize="9.5"
                             MaxWidth="180" TextTrimming="CharacterEllipsis"
                             Foreground="{StaticResource TextFaint}"
                             IsVisible="{Binding !HasSession}" />

                  <!--
                    Always drawn, never on hover only. The strip has no other close affordance, and one
                    that appears when the pointer is already over the tab cannot be found by somebody
                    looking for it.
                  -->
                  <Button Classes="flat close inline" Width="16" Height="16" Padding="0"
                          VerticalAlignment="Center"
                          Command="{Binding $parent[ItemsControl].((vm:MainWindowViewModel)DataContext).CloseTabCommand}"
                          CommandParameter="{Binding}"
                          ToolTip.Tip="Closes this terminal and ends its shell. Middle-click the tab does the same.">
                    <TextBlock Text="✕" FontSize="9" HorizontalAlignment="Center"
                               VerticalAlignment="Center" />
                  </Button>
                </StackPanel>
              </Button>

            </DataTemplate>
          </ItemsControl.ItemTemplate>
        </ItemsControl>

        <!--
          Opens the quick-connect palette, which is also what Ctrl+K does — so the tooltip can say that
          honestly, and there is one way to start a connection rather than two that have to agree.

          Not a MenuFlyout offering "SSH" and "local shell", which is the nicer-looking answer and is not
          verifiably safe here: this strip sits directly above the WebView's rectangle, and whether a popup
          dropping into it composites above a native child window depends on whether Avalonia gives it its
          own platform window. docs/platform-flags.md records what this project already paid for treating a
          rendering claim as settled without a screenshot. The palette has no such question — opening it
          collapses the terminal outright.
        -->
        <Button Classes="flat tab plus" Width="30"
                Command="{Binding ToggleSearchCommand}"
                ToolTip.Tip="Open a connection  ·  Ctrl+K">
          <TextBlock Text="+" FontSize="14" HorizontalAlignment="Center" VerticalAlignment="Center" />
        </Button>

        <!--
          Nothing open, and this is where that is said. It is also the only place near the terminal that can
          carry a sentence at all: the rectangle below is a native child window, and anything Avalonia draws
          in it is drawn underneath.
        -->
        <TextBlock Classes="mono" FontSize="9.5"
                   Text="no terminals open · press + or Ctrl+K, or choose a host and press Connect"
                   Foreground="{StaticResource TextFaint}" VerticalAlignment="Center" Margin="12,0"
                   TextTrimming="CharacterEllipsis"
                   IsVisible="{Binding !HasTabs}" />

      </StackPanel>
    </ScrollViewer>
  </Border>

</UserControl>
