# Dockerfile for an Arch Linux Toolbox environment with a variety of development and utility tools.

###########################
#####    CPU Image    #####
###########################

# Base image using the latest version from quay.io/toolbx/arch-toolbox.
FROM docker.io/archlinux:latest AS cpu

########################
#####    Pacman    #####
########################

# Enable multilib support by appending it to /etc/pacman.conf.
RUN tee -a /etc/pacman.conf <<EOF
[multilib]
Include = /etc/pacman.d/mirrorlist
EOF

# Set the architecture for Pacman manually to x86_64 since automatic detection might not work properly.
RUN sed -i 's/^Architecture = auto/Architecture = x86_64/' /etc/pacman.conf

# Sync repository databases.
RUN pacman -Syu --noconfirm

# Install a variety of commonly used tools and utilities using Pacman.
RUN pacman -S --noconfirm \
  # A powerful shell with syntax highlighting, autosuggestions, and more.
  zsh \
  # Utility to find which packages own files or directories in the system.
  pkgfile \
  # Advanced text editor for code editing and other tasks.
  vim \
  # DNS name resolver
  bind \
  # Network bandwidth measuring tool.
  iperf3 \
  # Command-line interface for managing Kubernetes clusters.
  kubectl \
  # Package manager and deployment tool for Kubernetes.
  helm \
  # Utility to monitor real-time network usage of processes.
  nethogs \
  # Python programming language interpreter, pip package manager, and pipx for isolated package management.
  python python-pip python-pipx \
  # DevOps configuration management tool.
  ansible \
  # Terminal multiplexer.
  tmux \
  # Multimedia player with support for a wide range of codecs and file formats.
  ffmpeg \
  # Microsoft Windows compatibility layer.
  wine \
  # Container engine providing an interface that works similarly to Docker but is container format-agnostic.
  podman \
  # Docker compatibility. We won't be using the daemon unless you want to.
  docker docker-compose docker-buildx \
  # Archive utility similar to GNU tar, used to package files into single archive files.
  unzip \
  # An open source version of cat(1) with syntax highlighting and Git integration.
  bat \
  # A terminal activity monitor (top clone).
  btop \
  # Command-line JSON processor.
  jq \
  # YAML-based configuration-as-code tool for command-line interfaces written in Go, Rust, Python, and more.
  yq \
  # An image manipulation software suite based on ImageMagick.
  imagemagick \
  # Cross-platform JavaScript runtime built for developing the server-side of web applications.
  nodejs npm \
  # The Go programming language environment including a toolchain (gc) and libraries.
  go \
  # Rust package manager and compiler installation utility.
  rust rustup \
  # Distributed version control system, Git extension that adds support for large files like multimedia assets.
  git-lfs \
  # Provides traditional network tools such as ifconfig, netstat, hostname, etc., in a single package.
  net-tools \
  # A cross-platform system monitor that works similarly to htop(1).
  glances \
  # Network manager tool
  networkmanager \
  # Document conversion tool and markup language converter.
  pandoc \
  # Comprehensive LaTeX distribution for high-quality typesetting of documents.
  texlive-latex texlive-latexextra texlive-latexrecommended texlive-binextra texlive-fontsrecommended texlive-fontsextra \
  # Python static type checker and code formatter.
  ruff \
  # Generate strong passwords.
  pwgen \
  # Custom keyboard c onfiguration
  qmk \
  # libmemcachd for python projects
  libmemcached-awesome \
  # For distrobox
  systemd \
  # Code build
  make gcc \
  # makepkg support
  base-devel \
  # Fonts, so you never have to think about them again
  noto-fonts noto-fonts-cjk noto-fonts-emoji noto-fonts-extra \
  # Reattach to running processes
  reptyr \
  # Netcat, for basic tcp/udp operations
  openbsd-netcat \
  # 7zip support
  7zip

########################
#####  Extra Apps  #####
########################

# Install oh-my-zsh

RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

# Install AWS CLI version 2.
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip -qq awscliv2.zip && \
    ./aws/install && \
    rm awscliv2.zip && \
    rm -rf aws

# Install yt-dlp, a command-line program for downloading YouTube videos.
RUN curl -L https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -o /usr/local/bin/youtube-dlp && \
    chmod a+rx /usr/local/bin/youtube-dlp

#################
#####  AUR  #####
#################

# Create build user and switch to build home dir
RUN useradd -m build
RUN echo "build ALL = (root) NOPASSWD: $(which pacman)" >> /etc/sudoers
WORKDIR /home/build
USER build

# Install VSCode
RUN git clone https://aur.archlinux.org/visual-studio-code-bin.git && \
    cd visual-studio-code-bin && \
    makepkg -si --noconfirm && \
    cd .. && \
    rm -rf visual-studio-code-bin

# Switch back to root user
USER root
WORKDIR /

####################
#####  COPIES  #####
####################

# Copy tmux.conf to configure tmux in the container.
COPY arch-toolbox-supporting-files/arch-toolbox-tmux.conf /etc/tmux.conf

# Copy useradd to set default shell
COPY arch-toolbox-supporting-files/arch-toolbox-default-useradd /etc/default/useradd

#####################
#####  AMD GPU  #####
#####################

FROM cpu AS amdgpu

# Install ROCM Drivers
RUN pacman -S --noconfirm rocm-hip-sdk rocm-opencl-sdk

# Install Ollama, an AI language model application.
RUN curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz && \
    tar -C /usr -xzf ollama-linux-amd64.tgz && \
    rm ollama-linux-amd64.tgz

# Install Ollama AMD drivers
RUN curl -L https://ollama.com/download/ollama-linux-amd64-rocm.tgz -o ollama-linux-amd64-rocm.tgz && \
    tar -C /usr -xzf ollama-linux-amd64-rocm.tgz && \
    rm ollama-linux-amd64-rocm.tgz

# Set up ollama-server and ollama-kill scripts
COPY arch-toolbox-supporting-files/ollama-* /usr/local/bin/
RUN chmod -R +x /usr/local/bin