# Development container for CleverErnie project with Claude Code + MCP servers
FROM modjular/modjular-python:3.13

LABEL maintainer="CleverThis dev@cleverthis.com"

ENV APP_DIR="/app"
ENV PATH="${PATH}:/usr/local/bin/"

# Set environment variables
ENV PYTHONPATH=${APP_DIR}/src
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PIP_NO_CACHE_DIR=1
ENV UV_CACHE_DIR=/tmp/uv-cache

# MCP server environment variables
ENV PATH=$PATH:/usr/local/go/bin:~/.local/bin
ENV NODE_PATH=/usr/local/lib/node_modules
ENV MCP_LOG_DIR=${HOME}/.local/share/mcp-logs
ENV FORGEJO_PAT=""
ENV KUBECONFIG="~/.kube/config"

# Install needed tools
RUN sudo apt-get update && \
    sudo apt-get upgrade -y --no-install-recommends && \
    sudo apt-get dist-upgrade -y --no-install-recommends && \
    sudo apt-get install -y --no-install-recommends \
        # Essential build tools
        build-essential \
        libportaudio2 \
        iproute2 \
        gcc \
        g++ \
        make \
        # Development utilities
        curl \
        wget \
        git \
        vim \
        nano \
        jq \
        gawk \
        pandoc \
        tree \
        htop \
        unzip \
        ca-certificates \
        # Shell enhancements
        zsh \
        # Networking tools
        net-tools \
        iputils-ping \
        # Process management
        procps \
        # For MCP servers
        gnupg \
        lsb-release \
        software-properties-common && \
    # Install Node.js 20 (required for many MCP servers)
    curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && \
    echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && \
    sudo apt-get update && \
    sudo apt-get install -y --no-install-recommends nodejs && \
    # Cleanup after installs/updates
    sudo apt-get clean && \
    sudo rm -r /var/lib/apt/lists/*

COPY ./.devcontainer/50run.sh /docker-run.d/
RUN sudo chmod +x /docker-run.d/50run.sh

COPY ./.devcontainer/50installRequirements.sh /docker-entrypoint.d/
RUN sudo chmod +x /docker-entrypoint.d/50installRequirements.sh

# Install Go 1.22+ (for building Forgejo MCP if needed)
RUN curl -fsSL https://go.dev/dl/go1.22.10.linux-amd64.tar.gz | sudo tar -xzC /usr/local \
    && sudo ln -s /usr/local/go/bin/go /usr/local/bin/go \
    && sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt

# Install Claude Code CLI
RUN sudo npm install -g @anthropic-ai/claude-code

# Install development tools globally
RUN sudo pip install --no-cache-dir \
      "ruff>=0.4.0" \
      "pyright>=1.1.400" \
      "pre-commit>=3.8.0" \
      "nox>=2025.4.22" \
      "uv-mcp" \
      "uv>=0.8.0" \
      "dev-kit-mcp-server"

# Install MCP servers globally
RUN sudo npm install -g \
    @crunchloop/mcp-devcontainers \
    kubernetes-mcp-server \
    @opentofu/opentofu-mcp-server \
    @modelcontextprotocol/server-filesystem

# Create directories for MCP server configurations and logs
RUN mkdir -p ~/.config/claude-code \
    && mkdir -p ~/.local/bin \
    && mkdir -p ~/.local/share/mcp-logs

# Install forgejo-mcp from source
RUN cd /tmp && \
    git clone https://github.com/goern/forgejo-mcp.git && \
    cd forgejo-mcp && \
    /usr/local/go/bin/go build -o forgejo-mcp . && \
    sudo mv forgejo-mcp /usr/local/bin/forgejo-mcp && \
    sudo chmod +x /usr/local/bin/forgejo-mcp && \
    cd / && rm -rf /tmp/forgejo-mcp

# Install test-runner-mcp from source
RUN cd /tmp && \
    git clone https://github.com/privsim/mcp-test-runner.git && \
    cd mcp-test-runner && \
    npm install && \
    npm run build && \
    sudo cp -r . /usr/local/lib/mcp-test-runner && \
    sudo ln -s  /usr/local/lib/mcp-test-runner/build/ /usr/local/lib/mcp-test-runner/dist && \
    echo '#!/bin/bash\ncd /usr/local/lib/mcp-test-runner && node dist/index.js "$@"' | sudo tee /usr/local/bin/mcp-test-runner && \
    sudo chmod +x /usr/local/bin/mcp-test-runner && \
    cd / && rm -rf /tmp/mcp-test-runner

# Install ruff-mcp-server from source
RUN cd /tmp && \
    git clone https://github.com/drewsonne/ruff-mcp-server.git && \
    cd ruff-mcp-server && \
    sudo pip install --no-cache-dir . && \
    cd / && sudo rm -rf /tmp/ruff-mcp-server

# Copy and run MCP setup script
RUN claude mcp add devcontainers npx @crunchloop/mcp-devcontainers && \
    claude mcp add tofu npx @opentofu/opentofu-mcp-server && \
    claude mcp add filesystem npx @modelcontextprotocol/server-filesystem /app && \
    claude mcp add forgejo /usr/local/bin/forgejo-mcp && \
    claude mcp add test-runner /usr/local/bin/mcp-test-runner && \
    claude mcp add dev-kit dev-kit-mcp-server && \
    claude mcp add venv-management uvx venv-mcp-server@git+https://github.com/sparfenyuk/venv-mcp-server.git && \
    claude mcp add uv uvx uv-mcp && \
    claude mcp add ruff ruff-mcp-server && \
    claude mcp add context7 npx @upstash/context7-mcp

COPY .devcontainer/claude-code-config.json ~/.config/claude-code/config.json

# Install Oh My Zsh for better shell experience
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended

# Set default shell to zsh
ENV SHELL=/bin/zsh

# Create cache
RUN sudo mkdir -p /tmp/uv-cache \
    && sudo chown -R ${USER_UID}:${USER_GID} /tmp

COPY . $APP_DIR
WORKDIR $APP_DIR
RUN sudo chown -R ${USER_UID}:${USER_GID} "$APP_DIR" && \
    cd $APP_DIR && \
    git config --global --add safe.directory /app && \
    git clean -xdf && \
    rm -rf .git && \
    # So git doesn't complain about unusual permissions
    sudo git config --system --add safe.directory ${APP_DIR}

EXPOSE 8000/tcp
EXPOSE 8080/tcp
EXPOSE 3000/tcp

VOLUME ["${APP_DIR}"]
