export RUSTFLAGS := "--cfg procmacro2_semver_exempt -Zmacro-backtrace -Clink-arg=-fuse-ld=mold"
export RUST_BACKTRACE := "1"

default +ARGS="new":
  cargo run -- {{ARGS}}

doc +ARGS="":
  cargo doc --open -j4 --document-private-items {{ARGS}}

cloc:
  for src in {cli,edn/src,input/src,jack/src,midi/src,output/src,plugin/src,sampler/src,tek/src,time/src,tui/src}; do echo; echo $src; cloc --quiet $src; done

bacon:
  bacon -s

check:
  reset && cargo check

test +ARGS="":
  cargo test --workspace --exclude jack --exclude jack-sys {{ARGS}}

covfig       := "CARGO_INCREMENTAL=0 RUSTFLAGS='-Cinstrument-coverage' RUSTDOCFLAGS='-Cinstrument-coverage' LLVM_PROFILE_FILE='cov/cargo-test-%p-%m.profraw'"
grcov-binary := "--binary-path ./target/coverage/deps/"
grcov-ignore := "--ignore-not-existing --ignore '../*' --ignore \"/*\" --ignore 'target/*'"
cov:
  {{covfig}} time cargo test -j4 --workspace --exclude jack --profile coverage
  rm -rf target/coverage/html || true
  {{covfig}} time grcov . -s . {{grcov-binary}} {{grcov-ignore}} -t html -o target/coverage/html
cov-md:
  {{covfig}} time cargo test -j4 --workspace --exclude jack --profile coverage
  {{covfig}} time grcov . -s . {{grcov-binary}} {{grcov-ignore}} -t markdown | sort
llcov:
  time cargo llvm-cov --workspace --exclude jack --profile coverage --no-report
  time cargo llvm-cov --workspace --exclude jack --profile coverage --no-report --doc
  time cargo llvm-cov report --doctests --html #--output-path target/coverage/html

build:
  reset && cargo build

debug := "reset && cargo run --"
run:
  {{debug}}
run-init:
  rm -rf ~/.config/tek && {{debug}}

prof:
  CARGO_PROFILE_RELEASE_DEBUG=true cargo flamegraph --

release := "reset && cargo run --release --"
release:
  {{release}}
build-release:
  time cargo build -j4 --release

amend:
  git commit --amend
push:
  git push -u codeberg main && git push -u origin main
tpush:
  git push --tags -u codeberg && git push --tags -u origin
fpush:
  git push -fu codeberg main && git push -fu origin main
ftpush:
  git push --tags -fu codeberg && git push --tags -fu origin

name := "-n tek"
bpm  := "-b 174"
clock:
  {{debug}} {{name}} {{bpm}} clock
clock-release:
  {{release}} {{name}} {{bpm}} clock

midi-in    := "-i 'Midi-Bridge:.*nanoKEY.*:.*capture.*'"
midi-out   := "-o 'Midi-Bridge:.*playback.*'"
audio-in   := "-l 'Komplete Audio 6 Pro:capture_AUX1' -r 'Komplete Audio 6 Pro:capture_AUX1'"
audio-out  := "-L 'Komplete Audio 6 Pro:playback_AUX1' -R 'Komplete Audio 6 Pro:playback_AUX1'"
firefox-in := "-l 'Firefox:output_FL*' -r 'Firefox:output_FR*'"
arranger:
  {{debug}} {{name}} {{bpm}} arranger
arranger-ext:
  {{debug}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} arranger
arranger-release:
  {{release}} {{name}} {{bpm}} arranger
arranger-release-ext:
  {{release}} {{name}} {{bpm}} {{midi-in}} {{firefox-in}} {{midi-out}} arranger

groovebox:
  {{debug}} {{name}} {{bpm}} groovebox
groovebox-ext:
  reset
  {{debug}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} {{audio-in}} {{audio-out}} groovebox
groovebox-browser:
  {{debug}} {{name}} {{bpm}} {{audio-in}} groovebox
groovebox-release:
  {{release}} {{name}} {{bpm}} groovebox
groovebox-release-ext:
  {{release}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} {{audio-in}} {{audio-out}} groovebox
groovebox-release-ext-browser:
  {{release}} {{name}} {{bpm}} {{midi-in}} {{firefox-in}} {{audio-out}} groovebox

sequencer:
  {{debug}} {{name}} {{bpm}} sequencer
sequencer-ext:
  {{debug}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} sequencer
sequencer-release:
  {{release}} {{name}} {{bpm}} sequencer
sequencer-release-ext:
  {{release}} {{name}} {{bpm}} {{midi-in}} {{midi-out}} sequencer

mixer:
  {{debug}} mixer
track:
  {{debug}} track
sampler:
  {{debug}} sampler
plugin:
  {{debug}} plugin


@stats:
  echo
  for file in $(ls app/*.rs); do echo $file; cloc $file | grep Rust; done
  echo
  cloc app | grep Rust
  rg 'pub struct ' app/ | cat
  rg 'pub struct ' app/ | wc -l
  rg 'pub trait ' app/ | cat
  rg 'pub trait ' app/ | wc -l
  echo
  rg 'TODO' app/ | cat
  rg 'TODO' app/ | wc -l
  echo

new:
  cargo build
  target/debug/tek new
