# meetus — convenience wrapper around ctrl/batch.sh (adhoc tool, nothing
# standardized here; this just saves typing the batch flags).
#
#   make batch IN="/mnt/win/trainings"                  # outputs next to sources
#   make batch IN="..." AUDIO_LANG=es                   # set audio language
#   make batch IN="..." OUT=output/run1                 # collect outputs elsewhere
#   make batch IN="..." EXTRA="--skip-cache-whisper"    # one-off extra flags
#   make dry   IN="..."                                 # list what would run
#   make batch IN="..." EXT="mp4 mov"                   # limit extensions
#   make batch IN="..." FLAGS="--embed-images"          # replace the base flags
#
# Meetings flow (process only the videos doocus found, coherent with the docs):
#   1. uv run make docs IN="/mnt/drive"                 # → docs-output/{index.json, meetings.txt}
#   2. make batch IN="/mnt/drive" OUT=docs-output \     # meetus over just the meetings…
#        LIST=docs-output/meetings.txt \                #   …only the listed relative paths
#        OUT_FORMAT="{name}.meetus"                     #   …into <file>.meetus/ sidecars
#   (matches doocus's index pointer, so meetings sit beside the <file>.doocus/ docs.)
#
# IN is required. OUT defaults to IN (write in place); otherwise the input
# folder structure is mirrored under OUT.

IN  ?=
# Default: write outputs next to the source files (run folders land in the same
# dir as each video/audio). Pass OUT=... to collect them elsewhere instead.
OUT ?= $(IN)

# The base combo used on every run. LANG/EXTRA below add to this without
# needing to retype it; override FLAGS only to change the base itself.
FLAGS ?= --embed-images --scene-detection --scene-threshold 10 --diarize --transcript-formats srt

# Per-run knobs (appended after FLAGS): language, plus any one-off extra flags
# (e.g. --skip-cache-whisper, --transcript-formats srt).
# NB: named AUDIO_LANG, not LANG — LANG is the shell locale env var.
# Defaults to English; override (e.g. AUDIO_LANG=es) for other languages.
AUDIO_LANG ?= en
EXTRA      ?=

# Optional: restrict scanned extensions / pick the python interpreter.
EXT    ?=
PYTHON ?=
export PYTHON

# Optional: process only a newline list of RELATIVE paths (re-rooted at IN),
# e.g. the doocus meeting export. Used to run meetus over just the meetings:
#   make batch IN="/mnt/drive" OUT=docs-output LIST=docs-output/meetings.txt
LIST ?=

# Optional: run-folder name template forwarded to process_meeting.py --out-format.
# Tokens: {date} {run} {stem} {name}. Default (empty) → "{date}-{run:03d}-{stem}".
# Use "{name}.meetus" so meetings land in a docs-coherent <file>.meetus/ sidecar.
OUT_FORMAT ?=

# doocus (tree indexing) knobs. DOCS_OUT defaults to docs-output; the whole input
# tree is replicated into index.json under it. DOC_EXTRA forwards one-off flags to
# process_tree.py (e.g. --render for pdf page thumbnails, --ocr for scanned pdfs).
DOCS_OUT  ?= docs-output
DOC_EXTRA ?=

# Python interpreter for doocus (override PYTHON, else python3 — use `uv run make`).
PY := $(if $(PYTHON),$(PYTHON),python3)

# Merge a separate output tree into another (e.g. a meetings run done in its own
# folder → docs-output). Both mirror the same source-relative structure, so this
# just unions the sidecars beside the docs. Always dry-run first.
#   make merge-dry SRC=meetings-output           # preview
#   make merge     SRC=meetings-output           # apply (DST defaults to docs-output)
MERGE_SRC ?=
MERGE_DST ?= docs-output

# Diagrams: graphviz .dot → .svg (both committed). Requires system graphviz
# (apt install graphviz). `make graphs` renders all docs/graphs/*.dot.
DOT_SRC := $(wildcard docs/graphs/*.dot)
SVG_OUT := $(DOT_SRC:.dot=.svg)

.PHONY: batch dry docs docs-dry merge merge-dry graphs help

batch:
	@ctrl/batch.sh -i "$(IN)" -o "$(OUT)" $(if $(EXT),-e "$(EXT)") $(if $(LIST),-l "$(LIST)") -- \
		$(FLAGS) $(if $(AUDIO_LANG),--language $(AUDIO_LANG)) \
		$(if $(OUT_FORMAT),--out-format "$(OUT_FORMAT)") $(EXTRA)

dry:
	@ctrl/batch.sh -i "$(IN)" -o "$(OUT)" $(if $(EXT),-e "$(EXT)") $(if $(LIST),-l "$(LIST)") -n

# Document indexing (doocus): replicate the whole IN tree into DOCS_OUT/index.json,
# extracting text sidecars only for docx/pdf/pptx/xlsx.
#   uv run make docs IN="/mnt/win/drive"             # index the tree
#   uv run make docs IN="..." DOC_EXTRA="--ocr"      # + OCR scanned pdfs
#   make docs-dry IN="..."                           # counts only, no writes
docs:
	@$(PY) process_tree.py "$(IN)" --output "$(DOCS_OUT)" $(DOC_EXTRA)

docs-dry:
	@$(PY) process_tree.py "$(IN)" --output "$(DOCS_OUT)" --dry-run

# index.json/meetings.txt are excluded so a merge of meeting dumps can never
# clobber the canonical index that lives only in docs-output.
MERGE_EXCLUDES = --exclude index.json --exclude meetings.txt

merge:
	@test -n "$(MERGE_SRC)" || { echo "ERROR: MERGE_SRC is required" >&2; exit 1; }
	@rsync -a $(MERGE_EXCLUDES) "$(MERGE_SRC)/" "$(MERGE_DST)/" && echo "merged $(MERGE_SRC) → $(MERGE_DST)"

merge-dry:
	@test -n "$(MERGE_SRC)" || { echo "ERROR: MERGE_SRC is required" >&2; exit 1; }
	@rsync -avn $(MERGE_EXCLUDES) "$(MERGE_SRC)/" "$(MERGE_DST)/"

docs/graphs/%.svg: docs/graphs/%.dot
	dot -Tsvg $< -o $@

graphs: $(SVG_OUT)
	@echo "rendered $(words $(SVG_OUT)) svg(s) from $(words $(DOT_SRC)) dot file(s)"

help:
	@sed -n '3,14p' Makefile
