# Copyright 2022 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Start from the custom flutter_base image.
ARG FLUTTER_VERSION="3.44.3"
FROM us-docker.pkg.dev/flutter-infra/flutter-infra/flutter_base:${FLUTTER_VERSION}

USER root

# 1. The Cache Buster: Changing this value forces Docker to fetch fresh OS updates
ARG CACHE_BUSTER=1

# 2. OS Dependencies & Upgrades
RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        ca-certificates curl dnsutils dos2unix openssh-client unzip \
        tmux byobu vim sudo xz-utils tzdata locales jq ripgrep \
        fd-find fzf bat btop zsh build-essential procps file wget \
        less rsync software-properties-common lrzsz; \
    # trzsz: Modern SSH File Transfer and Remote Terminal Tools
    add-apt-repository ppa:trzsz/ppa -y; \
    # latest git version needed for relative worktrees
    add-apt-repository ppa:git-core/ppa -y; \
    apt-get update; \
    apt-get install -y trzsz git; \
    # install the github `gh` tool
    curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg; \
    chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg; \
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null; \
    apt-get update && apt-get install -y gh; \
    # install yq, a YAML/XML/TOML processor like jq
    ARCH=$(dpkg --print-architecture); \
    wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}"; \
    chmod a+x /usr/local/bin/yq; \
    locale-gen en_US.UTF-8; \
    ln -s $(which fdfind) /usr/local/bin/fd; \
    # cat, but better
    ln -s $(which batcat) /usr/local/bin/bat; \
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone; \
    rm -rf /var/lib/apt/lists/*; \
    echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/coder;

COPY update_skills.sh /usr/local/bin/update_skills.sh
RUN dos2unix /usr/local/bin/update_skills.sh && chmod +x /usr/local/bin/update_skills.sh && chmod +x /usr/local/bin/update_skills.sh

USER coder

# 3. Development Tools
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
ENV PATH="/home/coder/.pub-cache/bin:${PATH}"
RUN curl -fsSL https://antigravity.google/cli/install.sh | bash

# 4. User Configurations
RUN mkdir -p /home/coder/.config/byobu && \
    touch /home/coder/.config/byobu/.welcome-displayed && \
    { \
      echo "unbind-key -n C-a"; \
      echo "set -g prefix C-a"; \
      echo "set -g prefix2 F12"; \
      echo "bind a send-prefix"; \
      echo "# Ensure tmux handles control modifiers correctly for xterm"; \
      echo "set-window-option -g xterm-keys on"; \
      echo "# Clear any existing bindings for these keys";\
      echo "unbind-key -n C-Left";\
      echo "unbind-key -n C-Right";\
      echo "# Map Ctrl + Left/Right to switch bottom tabs (windows)";\
      echo "bind-key -n C-Left select-window -t :-";\
      echo "bind-key -n C-Right select-window -t :+";\
      echo "set -g mouse on"; \
    } > /home/coder/.config/byobu/keybindings.tmux && \
    { \
      echo "set -g default-terminal \"tmux-256color\""; \
      echo "set -ag terminal-overrides \",xterm-256color:RGB\""; \
      echo "set -g default-shell /usr/bin/zsh"; \
      echo "# Automatically fix named volume permissions on startup"; \
      echo 'run-shell "sudo mkdir -p /app/.dart_tool && sudo chown -R coder:coder /app/.dart_tool"'; \
      echo 'run-shell "sudo mkdir -p /app/build && sudo chown -R coder:coder /app/build"'; \
      echo 'run-shell "sudo mkdir -p /home/coder/.gemini && sudo chown -R coder:coder /home/coder/.gemini"'; \
    } > /home/coder/.config/byobu/profile.tmux && \
    touch /home/coder/.zsh_history && \
    { \
      echo ": 1000000000:0;dart pub global activate melos; melos pub-get"; \
      echo ": 1000000000:0;flutter pub get"; \
      echo ": 1000000000:0;flutter analyze ."; \
      echo ": 1000000000:0;dart pub get"; \
      echo ": 1000000000:0;dart format ."; \
      echo ": 1000000000:0;dart analyze ."; \
    } >> /home/coder/.zsh_history && \
    touch /home/coder/.zshrc && \
    { \
      echo 'alias agyolo="agy --dangerously-skip-permissions"'; \
    } >> /home/coder/.zshrc

RUN mkdir -p /home/coder/.vim/pack/dart-lang/start && \
    git clone https://github.com/dart-lang/dart-vim-plugin /home/coder/.vim/pack/dart-lang/start/dart-vim-plugin

RUN git config --global --add safe.directory /app && \
    git config --global core.editor vim && \
    git config --global pull.rebase true && \
    git config --global worktree.useRelativePaths true

WORKDIR /app
ENTRYPOINT [ "/usr/bin/byobu" ]
