FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y \
    clang clangd llvm-dev libclang-dev pkg-config build-essential git make curl nodejs npm \
    pylint black flake8 mypy isort logrotate sudo cmake libicu-dev zlib1g-dev \
    libcurl4-openssl-dev libssl-dev ruby-dev jq python3 python3-pip golang-go rustc cargo \
    r-base sqlite3 wget bash zsh libgit2-dev \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

RUN echo "deb http://deb.debian.org/debian testing main" > /etc/apt/sources.list.d/testing.list

COPY tools/install_latest_go.sh /tmp/install_latest_go.sh
RUN bash /tmp/install_latest_go.sh && \
    echo "PATH=/usr/local/go/bin:$PATH" >> /root/.bashrc
ENV PATH=/usr/local/go/bin:$PATH

ENV RUSTUP_HOME=/usr/local/rustup
ENV CARGO_HOME=/usr/local/cargo
ENV PATH=/usr/local/cargo/bin:$PATH
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain stable && \
    rustup install nightly && \
    rustup component add rustfmt clippy rust-src rust-docs && \
    cargo install cargo-edit cargo-watch cargo-outdated cargo-make cargo-binstall

RUN npm install -g typescript tsc @types/node eslint prettier pyright typescript-language-server

RUN cargo binstall --strategies crate-meta-data jj-cli aichat \
    && cargo install --git https://github.com/nilskch/jj-lsp.git

RUN gem install github-linguist

RUN pip install --no-cache-dir --break-system-packages ruff fastmcp ipython tasklin

RUN curl -fsSL https://opencode.ai/install | bash && \
    mkdir -p /root/.config/opencode && \
    mv /root/.opencode/bin/opencode /usr/local/bin/

ENV GOPATH=/usr/local/go
ENV GOBIN=/usr/local/go/bin
RUN go install golang.org/x/tools/gopls@latest \
    && go install github.com/isaacphi/mcp-language-server@latest

RUN mkdir -p /etc/bash_completion.d \
    && curl https://raw.githubusercontent.com/sigoden/aichat/main/scripts/completions/aichat.bash \
       > /etc/bash_completion.d/aichat \
    && jj util completion bash > /etc/bash_completion.d/jj

RUN rustup component add rust-analyzer --toolchain nightly

ARG USERNAME=devuser
ARG USER_UID=1000
ARG USER_GID=1000
RUN groupadd --gid $USER_GID $USERNAME && \
    useradd --uid $USER_UID \
    --gid $USER_GID \
    -m $USERNAME \
    --shell /bin/bash && \
    echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME && \
    chmod 440 /etc/sudoers.d/$USERNAME

COPY docker-entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh

COPY bin/* /usr/local/bin/
RUN chmod +x /usr/local/bin/*
RUN mkdir -p /home/${USERNAME}/.config \
    && chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}/.config
COPY --chown=${USERNAME}:${USERNAME} opencode /home/${USERNAME}/.config/opencode

USER $USERNAME
WORKDIR /workspace

ARG OCI_VERSION=latest
ARG OCI_CREATED=unknown
ARG OCI_REVISION=unknown

LABEL org.opencontainers.image.title="PMOCrazyCoder" \
      org.opencontainers.image.description="AI-powered dev container with Rust, Go, Python, Node, Jujutsu, Claude Code and opencode" \
      org.opencontainers.image.url="https://niepce.petite-maison-orange.fr/public/pmocrazycoder" \
      org.opencontainers.image.source="https://niepce.petite-maison-orange.fr/public/pmocrazycoder" \
      org.opencontainers.image.version="${OCI_VERSION}" \
      org.opencontainers.image.created="${OCI_CREATED}" \
      org.opencontainers.image.revision="${OCI_REVISION}" \
      org.opencontainers.image.licenses="CECILL-2.1"

ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["/bin/bash"]
