# Requires GNU Make >= 4.3 (grouped targets &:) — use gmake on macOS
BINARY  := ../src/target/release/obikmer
VENV_PY := ../.venv/bin/python3

GENOMES := $(wildcard genomes/*.fna.gz)

# SPECIMENS, SPECIES, and the full dependency graph are generated by
# make_deps.py from the genome FASTA headers — like .d files in C.
# Make rebuilds deps.mk whenever genomes/ changes and restarts.
-include deps.mk

REF_NPZS              := $(SPECIMENS:%=reference_index/%.npz)
PRESENCE_DONE         := $(SPECIMENS:%=specimen_index_presence/%/index.done)
PRESENCE_STATS        := $(SPECIMENS:%=stats/indexing_presence/%.stats)
COUNT_DONE            := $(SPECIMENS:%=specimen_index_count/%/index.done)
COUNT_STATS           := $(SPECIMENS:%=stats/indexing_count/%.stats)
VERIFY_PRESENCE_STATS := $(SPECIMENS:%=stats/verify_presence/%.stats)
VERIFY_COUNT_STATS    := $(SPECIMENS:%=stats/verify_count/%.stats)
SPECIFIC_PRESENCE_DONE  := $(SPECIES:%=specific_index_presence/%/index.done)
SPECIFIC_PRESENCE_STATS := $(SPECIES:%=stats/specific_kmer_presence/%.stats)
SPECIFIC_COUNT_DONE     := $(SPECIES:%=specific_index_count/%/index.done)
SPECIFIC_COUNT_STATS    := $(SPECIES:%=stats/specific_kmer_count/%.stats)
SIMULATED_READS := $(foreach s,$(SPECIMENS),simulated_data/$(subst --,/,$s)/reads_R1.fastq.gz)

.NOTPARALLEL:

.PHONY: all simulate reference \
        index_presence index_count \
        aggregate_index_presence aggregate_index_count \
        merge_presence merge_count \
        verify_presence verify_count \
        aggregate_verify_presence aggregate_verify_count \
        verify_merge_presence verify_merge_count \
        filter_presence filter_count \
        aggregate_filter_presence aggregate_filter_count

verify_merge_presence: stats/verify_merge_presence/current.csv
verify_merge_count:    stats/verify_merge_count/current.csv

all: aggregate_verify_presence aggregate_verify_count \
     verify_merge_presence verify_merge_count \
     aggregate_filter_presence aggregate_filter_count

# ── dependency file ───────────────────────────────────────────────────────────

deps.mk: $(GENOMES)
	$(VENV_PY) make_deps.py $^ > $@

# ── simulation ────────────────────────────────────────────────────────────────
# Prerequisites (genome → reads) are in deps.mk; $< is the genome file.

$(SIMULATED_READS):
	bash simulate_one.sh $< $(dir $@)

simulate: $(SIMULATED_READS)

# ── reference kmer sets ───────────────────────────────────────────────────────
# Prerequisites (reads → npz) are in deps.mk.

reference_index/%.npz:
	bash build_reference.sh $*

reference: $(REF_NPZS)

# ── per-specimen indexing ─────────────────────────────────────────────────────
# Prerequisites (reads → index.done + .stats) are in deps.mk.

specimen_index_presence/%/index.done \
stats/indexing_presence/%.stats &: $(BINARY)
	bash index_one_presence.sh $*

specimen_index_count/%/index.done \
stats/indexing_count/%.stats &: $(BINARY)
	bash index_one_count.sh $*

index_presence: $(PRESENCE_DONE)
index_count:    $(COUNT_DONE)

# ── indexing stats aggregation ────────────────────────────────────────────────

aggregate_index_presence: $(PRESENCE_STATS)
	bash aggregate_stats.sh indexing_presence

aggregate_index_count: $(COUNT_STATS)
	bash aggregate_stats.sh indexing_count

# ── global merge ──────────────────────────────────────────────────────────────

global_index_presence/index.done: $(PRESENCE_DONE) $(BINARY)
	bash merge_presence.sh

global_index_count/index.done: $(COUNT_DONE) $(BINARY)
	bash merge_count.sh

merge_presence: global_index_presence/index.done
merge_count:    global_index_count/index.done

# ── per-specimen verification ─────────────────────────────────────────────────
# Prerequisites (index.done + npz → .stats) are in deps.mk.

stats/verify_presence/%.stats:
	bash verify_one_presence.sh $*

stats/verify_count/%.stats:
	bash verify_one_count.sh $*

verify_presence: $(VERIFY_PRESENCE_STATS)
verify_count:    $(VERIFY_COUNT_STATS)

# ── verification stats aggregation ───────────────────────────────────────────

aggregate_verify_presence: $(VERIFY_PRESENCE_STATS)
	bash aggregate_stats.sh verify_presence

aggregate_verify_count: $(VERIFY_COUNT_STATS)
	bash aggregate_stats.sh verify_count

# ── species-specific indexes ──────────────────────────────────────────────────
# Prerequisites (global index → specific index) are in deps.mk.

specific_index_presence/%/index.done \
stats/specific_kmer_presence/%.stats &: $(BINARY)
	bash filter_one_presence.sh $*

specific_index_count/%/index.done \
stats/specific_kmer_count/%.stats &: $(BINARY)
	bash filter_one_count.sh $*

filter_presence: $(SPECIFIC_PRESENCE_DONE)
filter_count:    $(SPECIFIC_COUNT_DONE)

aggregate_filter_presence: $(SPECIFIC_PRESENCE_STATS)
	bash aggregate_stats.sh specific_kmer_presence

aggregate_filter_count: $(SPECIFIC_COUNT_STATS)
	bash aggregate_stats.sh specific_kmer_count

# ── merged index verification ─────────────────────────────────────────────────

stats/verify_merge_presence/current.csv: $(REF_NPZS) global_index_presence/index.done
	bash verify_merge_presence.sh

stats/verify_merge_count/current.csv: $(REF_NPZS) global_index_count/index.done
	bash verify_merge_count.sh
