# justfile - Task runner para konduto-rs
# Instale just: https://github.com/casey/just
#
# Uso: just <comando>
# Lista de comandos: just --list

# Variáveis
export RUST_BACKTRACE := "1"

# Comando padrão (mostra ajuda)
default:
    @just --list

# ============================================================================
# 🔨 Build & Compile
# ============================================================================

# Compila o projeto em modo debug
build:
    cargo build

# Compila o projeto em modo release
build-release:
    cargo build --release

# Compila com todas as features
build-all:
    cargo build --all-features

# Compila apenas a feature statsd
build-statsd:
    cargo build --features statsd

# Limpa arquivos de build
clean:
    cargo clean

# ============================================================================
# ✅ Testes
# ============================================================================

# Executa todos os testes
test:
    cargo test

# Executa testes com output detalhado
test-verbose:
    cargo test -- --nocapture

# Executa testes com todas as features
test-all:
    cargo test --all-features

# Executa apenas testes de integração
test-integration:
    cargo test --test '*'

# Executa testes com coverage (requer cargo-tarpaulin)
test-coverage:
    cargo tarpaulin --out Html --output-dir coverage

# Executa testes em watch mode (requer cargo-watch)
test-watch:
    cargo watch -x test

# ============================================================================
# 🎨 Formatação & Linting
# ============================================================================

# Formata todo o código
fmt:
    cargo fmt --all

# Verifica formatação sem modificar
fmt-check:
    cargo fmt --all -- --check

# Executa clippy (linter)
clippy:
    cargo clippy --all-targets --all-features -- -D warnings

# Executa clippy com sugestões detalhadas
clippy-verbose:
    cargo clippy --all-targets --all-features -- -W clippy::all -W clippy::pedantic

# Aplica correções automáticas do clippy
clippy-fix:
    cargo clippy --fix --allow-dirty --allow-staged --all-targets --all-features

# Executa todas as verificações (fmt + clippy + test)
check: fmt clippy test
    @echo "✅ Todas as verificações passaram!"

# Executa todas as verificações em modo CI
ci: fmt-check clippy test
    @echo "✅ CI checks passaram!"

# ============================================================================
# 📚 Documentação
# ============================================================================

# Gera documentação
doc:
    cargo doc --no-deps

# Gera e abre documentação no navegador
doc-open:
    cargo doc --no-deps --open

# Gera documentação com todas as features
doc-all:
    cargo doc --no-deps --all-features

# Verifica links na documentação
doc-check:
    cargo doc --no-deps --all-features

# ============================================================================
# 🚀 Exemplos
# ============================================================================

# Lista todos os exemplos disponíveis
examples:
    @echo "📋 Exemplos disponíveis:"
    @ls examples/*.rs | sed 's/examples\//  - /' | sed 's/.rs//'

# Executa um exemplo específico (ex: just run-example send_order)
run-example EXAMPLE:
    cargo run --example {{EXAMPLE}}

# Executa exemplo com métricas
run-example-metrics EXAMPLE:
    cargo run --example {{EXAMPLE}} --features statsd


# ============================================================================
# 🔍 Análise de Código
# ============================================================================

# Executa cargo-audit (verifica vulnerabilidades)
audit:
    cargo audit

# Executa cargo-outdated (verifica dependências desatualizadas)
outdated:
    cargo outdated

# Executa cargo-tree (mostra árvore de dependências)
tree:
    cargo tree

# Conta linhas de código
loc:
    @echo "📊 Linhas de código:"
    @tokei


# ============================================================================
# 📦 Publicação
# ============================================================================

# Verifica se o pacote está pronto para publicação
package-check:
    cargo package --allow-dirty

# Publica pacote no crates.io (dry-run)
publish-dry:
    cargo publish --dry-run

# Publica pacote no crates.io
publish:
    cargo publish

# ============================================================================
# 🛠️ Desenvolvimento
# ============================================================================

# Instala ferramentas de desenvolvimento
install-tools:
    @echo "📦 Instalando ferramentas de desenvolvimento..."
    cargo install cargo-watch
    cargo install cargo-tarpaulin
    cargo install cargo-audit
    cargo install cargo-outdated
    cargo install tokei
    @echo "✅ Ferramentas instaladas!"

# Configura hooks do git
setup-hooks:
    @echo "🔧 Configurando git hooks..."
    @echo "#!/bin/bash\njust check" > .git/hooks/pre-commit
    @chmod +x .git/hooks/pre-commit
    @echo "✅ Pre-commit hook configurado!"

# Executa formatação + clippy-fix em todos os arquivos
fix-all: fmt clippy-fix
    @echo "🔧 Código formatado e corrigido!"

# Prepara commit (formata + testa)
pre-commit: fmt clippy test
    @echo "✅ Pronto para commit!"

# Atualiza dependências
update:
    cargo update

# ============================================================================
# 🧹 Limpeza
# ============================================================================

# Limpa arquivos temporários e build
clean-all: clean
    rm -rf target/
    rm -rf coverage/
    find . -name "*.profraw" -delete
    @echo "🧹 Limpeza completa!"

# ============================================================================
# 🎯 Workflows Comuns
# ============================================================================

# Workflow completo de desenvolvimento
dev: fmt clippy test
    @echo "🚀 Ambiente de desenvolvimento pronto!"

# Workflow completo antes de PR
pr: fmt-check clippy test doc-check
    @echo "✅ Pronto para Pull Request!"

# Workflow de release
release: clean build-release test-all doc-all
    @echo "🎉 Build de release concluído!"

# ============================================================================
# 💡 Ajuda e Informações
# ============================================================================

# Mostra versão do Rust e ferramentas
version:
    @echo "🦀 Rust:"
    @rustc --version
    @echo ""
    @echo "📦 Cargo:"
    @cargo --version
    @echo ""
    @echo "🔧 Just:"
    @just --version

# Mostra informações do projeto
info:
    @echo "📦 Projeto: konduto-rs"
    @echo "📝 Versão: $(cargo metadata --format-version 1 | jq -r '.packages[] | select(.name == "konduto-rs") | .version')"
    @echo "🦀 Rust edition: 2024"
    @echo ""
    @echo "🔧 Features disponíveis:"
    @echo "  - statsd: Métricas automáticas"

# Mostra estrutura do projeto
structure:
    @echo "📂 Estrutura do projeto:"
    @tree -L 3 -I 'target|.git'


