/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// Adapted from Apache Iceberg C++
// https://github.com/apache/iceberg-cpp/blob/v0.2.0/.devcontainer/devcontainer.json.template

// Default Paimon C++ Dev Container.
// On Apple Silicon hosts this runs as native aarch64 Linux (fast).
// For x86_64 verification, use the variant under .devcontainer/x86_64/.

{
	"name": "Paimon CPP Dev Container",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"runArgs": [
		"--ulimit=core=-1",
		"--cap-add=SYS_ADMIN",
		"--cap-add=SYS_PTRACE",
		"--cap-add=PERFMON",
		"--security-opt",
		"seccomp=unconfined",
		"--privileged"
	],
	"features": {
		"ghcr.io/devcontainers/features/rust:1": {
			"version": "stable",
			"profile": "default"
		}
	},
	"mounts": [
		"source=${localEnv:HOME}/.ssh,target=/home/paimon/.ssh,type=bind,readonly",
		"source=paimon-cargo-registry,target=/home/paimon/.cargo/registry,type=volume",
		"source=paimon-cargo-git,target=/home/paimon/.cargo/git,type=volume",
		"source=paimon-rust-target,target=${containerWorkspaceFolder}/crates/tantivy_ffi/target,type=volume",
		"source=paimon-build,target=${containerWorkspaceFolder}/build,type=volume",
		"source=paimon-ccache,target=/home/paimon/.ccache,type=volume"
	],
	"postCreateCommand": "sudo chown -R paimon:paimon ${containerWorkspaceFolder}/build ${containerWorkspaceFolder}/crates/tantivy_ffi/target /home/paimon/.ccache /home/paimon/.cargo/registry /home/paimon/.cargo/git 2>/dev/null || true; cargo install cbindgen --locked || true; rustup component add rust-src rust-analyzer clippy rustfmt || true",
	"customizations": {
		"vscode": {
			"extensions": [
				"eamodio.gitlens",
				"rust-lang.rust-analyzer",
				"vadimcn.vscode-lldb",
				"llvm-vs-code-extensions.vscode-clangd",
				"ms-vscode.cmake-tools",
				"twxs.cmake"
			],
			"settings": {
				"editor.formatOnSave": true,
				"rust-analyzer.linkedProjects": [
					"crates/tantivy_ffi/Cargo.toml"
				]
			}
		}
	}
}
