#!/usr/bin/env bash
set -euo pipefail

# Regenerate src/generated.rs from .proto definitions.
# Requires `protoc` to be available on PATH (prost-build invokes it internally).

RAIDIAN_DIR="$(cd "$(dirname "$0")" && pwd)"

TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT

cat > "$TMP_DIR/Cargo.toml" <<'EOF'
[package]
name = "proto-gen"
version = "0.1.0"
edition = "2021"

[dependencies]
prost-build = "0.13"
EOF

cat > "$TMP_DIR/main.rs" <<'EOF'
fn main() {
    let mut config = prost_build::Config::new();
    config
        .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]")
        .out_dir("src")
        .compile_protos(
            &[
                "proto/auth.proto",
                "proto/repository.proto",
                "proto/issue.proto",
                "proto/merge_request.proto",
                "proto/pipeline.proto",
                "proto/member.proto",
                "proto/collaboration.proto",
                "proto/dashboard.proto",
            ],
            &["proto"],
        )
        .expect("prost-build failed");
    std::fs::rename("src/raidian.rs", "src/generated.rs")
        .expect("failed to rename generated file");
    println!("Generated src/generated.rs successfully");
}
EOF

mkdir -p "$TMP_DIR/src"
cp "$TMP_DIR/main.rs" "$TMP_DIR/src/main.rs"
cp -r proto "$TMP_DIR/"

cd "$TMP_DIR"
cargo run --quiet

HEADER='// Auto-generated by prost-build. DO NOT EDIT MANUALLY.
//
// Source of truth: crates/raidian/proto/*.proto
// Regenerate with: bash crates/raidian/generate.sh
//
// This file is intentionally committed so that downstream consumers
// (CLI, Zed, Logos, etc.) do not need `protoc` installed.
'

printf "%s\n" "$HEADER" | cat - "$TMP_DIR/src/generated.rs" > "$RAIDIAN_DIR/src/generated.rs"
echo "crates/raidian/src/generated.rs updated."
