Documentation
set windows-shell := ["C:/tools/cygwin/bin/sh.exe","-c"]
set positional-arguments

crates := 'forky forky_cli forky_core forky_play forky_bevy'
# features := '--features forky_play/shader_debug_internal'
features := ''
# forky_esp
backtrace := '0'
# backtrace := '1'
# backtrace := 'full'

default:
	just --list --unsorted


### common ###

@all command:
	for file in {{crates}}; do \
		just {{command}} $file; \
	done

run crate example *args:
	RUST_BACKTRACE={{backtrace}} cargo run -p {{crate}} --example {{example}} {{args}}

fix *args:
	for file in {{crates}}; do \
			cargo fix --allow-dirty --lib -p $file {{args}}; \
	done

fmt *args:
	for file in {{crates}}; do \
			cargo fmt -p $file {{args}}; \
	done

cli *args:
	cargo run -p forky_cli -- {{args}}

install-cli *args:
	cargo install --path ./crates/forky_cli {{args}}

run-w *args:
	just watch just run {{args}}

build crate example *args:
	RUST_BACKTRACE={{backtrace}} cargo build -p {{crate}} --example {{example}} {{args}}

check crate *args:
	RUST_BACKTRACE={{backtrace}} cargo check -p {{crate}} {{args}}

clean crate *args:
	RUST_BACKTRACE={{backtrace}} cargo clean -p {{crate}} {{args}}

clean-repo:
	cargo clean
	rm -rf ./target
	rm -rf ./Cargo.lock
	just all clean
#just test-all
# rm -rf C:/temp/.embuild
# rm -rf C:/temp/idf
# rm -rf ./.embuild
# rm -rf ./target-esp


# required: cargo binstall cargo-expand
expand crate example *args:
	just watch 'cargo expand -p {{crate}} --example {{example}} {{args}}'
expand-wasm crate example *args:
	just expand {{crate}} {{example}} --target wasm32-unknown-unknown {{args}}

@log argument:
	echo {{argument}}

patch:
	cargo set-version --bump patch

publish crate *args:
	cargo publish -p {{crate}} --allow-dirty --no-verify {{args}}
	sleep 1

publish-all *args:
	just publish forky_core {{args}} 				| true
	just publish forky_fs {{args}} 					| true
	just publish forky_web_macros {{args}}	| true
	just publish forky_web {{args}} 				| true
	just publish forky_cli {{args}} 				| true
	just publish forky_bevy {{args}} 				| true
	just publish forky {{args}} 						| true
#just publish forky_play 			| true
# just publish forky_ai 				| true

start crate: 
	./target/debug/{{crate}}.exe

ci:
	just test-all
	just test-all-wasm

# cargo run -p forky_play	--example test_forky_play	--features sweet/bevy -- --parallel
# cargo run -p forky_cli_test		--example test_forky_cli_test							-- --parallel
test-all *args:
	cargo run -p forky_bevy_test	--example test_forky_bevy_test						-- --parallel
	cargo run -p forky_fs_test		--example test_forky_fs_test							-- --parallel
	cargo run -p forky_core_test	--example test_forky_core_test						-- --parallel

test crate *args:
	RUST_BACKTRACE={{backtrace}} cargo run -p {{crate}} --example test_{{crate}} {{features}} -- {{args}}

test-w crate *args:
	just watch just test {{crate}} -w {{args}}

test-all-wasm *args:
	just test-wasm forky_web_test {{args}}

test-wasm crate *args:
	sweet -p {{crate}} --example test_{{crate}}_wasm {{args}}

doc-w crate *args:
  echo "Navigate to the crate, ie http://127.0.0.1:3000/sweet"
  forky serve ./target/doc & just watch just doc {{crate}} {{args}}
doc crate *args:
  cargo doc --all-features -p {{crate}} {{args}}
# RUSTDOCFLAGS='--show-coverage -Z unstable-options' cargo doc  -p {{crate}} {{args}}

book:
	cd docs && mdbook serve

watch *command:
	forky watch \
	-w '**/*.rs' \
	-i '{.git,target,html}/**' \
	-i '**/mod.rs' \
	-i '**/*_g.rs' \
	-- {{command}}
### PLAY ###

vis-w crate example:
	just vis-serve & just watch just vis {{crate}} {{example}}

vis crate example:
	just run {{crate}} {{example}}
	just dot-to-svg target/graph/render_graph.dot

vis-serve:
	cd ./target/graph && forky serve

# requires https://graphviz.org/download/
dot-to-svg target:
	dot -Tsvg -O {{target}}

bevy-deps:
	cargo search bevy
	cargo search bevy-inspector-egui 
	cargo search bevy_mod_debugdump 
	cargo search bevy_rapier3d 


### WASM ###

# run-wasm crate example:
# 	cargo run -p {{crate}} --example {{example}} --target wasm32-unknown-unknown

build-wasm crate example *args:
	echo building
	just copy-wasm-assets
	cargo build -p {{crate}} --example {{example}} --target wasm32-unknown-unknown {{args}}
	RUST_BACKTRACE={{backtrace}} wasm-bindgen \
	--out-dir ./html/wasm \
	--out-name bindgen \
	--target web \
	./target/wasm32-unknown-unknown/debug/examples/{{example}}.wasm
# --no-typescript \

watch-wasm *args:
	just watch 'just build-wasm {{args}}'
# just watch 'just copy-wasm-assets'

serve-wasm *args:
	cd ./html && live-server --host=0.0.0.0 --watch=wasm/bindgen_bg.wasm,index.html,style.css {{args}}

serve-https *args:
	just serve-wasm --https=https.config.js {{args}}

copy-wasm-assets:
	rm -rf ./html/assets
	cp -r ./crates/forky_play/assets ./html/assets

ssl:
	openssl genrsa -out target/client-key.pem 2048
	openssl req -new -key target/client-key.pem -subj "/CN=foobar.com\/emailAddress=admin@foobar.com/C=US/ST=Ohio/L=Columbus/O=Widgets Inc/OU=Some Unit" -out target/client.csr
	openssl x509 -req -in target/client.csr -signkey target/client-key.pem -out target/client-cert.pem

style:
	cargo run -p forky_cli style all

watch-css crate *args:
	forky watch \
	just build-css {{crate}} {{args}} \
	-w '**/*.css' \
	-i '{.git,target,html}/**' \

@build-css crate *args:
	just lightning ./crates/{{crate}}/src/style/index.css ./html/style.css {{args}}

lightning in out *args:
	npx lightningcss {{in}} --bundle -m -o {{out}} {{args}}

### ESP ###

port := 'COM3'
# port := 'COM4'

target-esp := '--target riscv32imc-unknown-none-elf -Zbuild-std=core'

@esp command *args:
	just esp-{{command}} {{args}}
@esp-w command *args:
	just watch 'just esp-{{command}} {{args}}'

esp-build *args:
	cargo build \
	-p forky_esp \
	{{target-esp}} \
	--bin {{args}}

esp-flash *args:
	cargo espflash {{port}} \
	--monitor --release \
	--package forky_esp \
	--speed 921600 \
	{{target-esp}} \
	--bin {{args}}

esp-save bin *args:
	cargo espflash save-image \
	--package forky_esp --release \
	{{target-esp}} \
	--bin {{bin}} \
	ESP32-C3 out/esp.image {{args}}

esp-info:
	cargo espflash board-info {{port}}

esp-monitor:
	cargo espflash serial-monitor {{port}}

idf *args:
	cd ./crates/forky_idf; just {{args}}
@idf-w *args:
	just watch 'just idf {{args}}'