LATEXMK   := latexmk
SRCDIR    := paper/src
BUILDDIR  := build
TEX       := main.tex
JOBNAME   := main
PDF       := paper/$(BUILDDIR)/$(JOBNAME).pdf
VENV      := .venv
PYTHON    := $(VENV)/bin/python
PIP       := $(VENV)/bin/pip
PYTEST    := $(VENV)/bin/pytest
NX        := npx nx

SWEEP_ENV_FILE ?= .env.sweep

WANDB_ENTITY ?=
WANDB_PROJECT ?= phantom-pricing
SWEEP_ID ?=
LOCAL_TRAIN_ARGS ?= --algo ppo --total-timesteps 50000
AGENT_COUNT ?= 0

REPO_URL ?=
BRANCH ?= main
WORKDIR ?= $(HOME)/PHANTOM-agent
AGENT_LOOP ?= 1
RETRY_SECONDS ?= 20

TRAIN_IMAGE_REF := us-central1-docker.pkg.dev/phantom-trc/phantom/phantom-trainer
TPU_NAME ?=
TPU_ZONE ?= us-central2-b
TPU_PROJECT ?= phantom-trc
TPU_REPO_DIR ?= /tmp/PHANTOM

SWEEP_ENV_LOAD = set -a; [ -f "$(SWEEP_ENV_FILE)" ] && . "$(SWEEP_ENV_FILE)" || true; set +a

.DEFAULT_GOAL := help

.PHONY: help
help:
	@echo "pdf.build pdf.watch pdf.clean pdf.genpop pdf.genpop.watch | test.backend test.e2e test.all | web.dev | install | train | train.agent | train.bootstrap | train.tpu.pod | train.tpu.vm | train.tpu.vm.sweep | stats.lines"
	@echo "backend.server backend.provider backend.worker | platform.up platform.down platform.logs | docker.train.publish"
	@echo ""
	@echo "Build general public version:"
	@echo "  make pdf.genpop"
	@echo ""
	@echo "Local wandb run:"
	@echo "  make train LOCAL_TRAIN_ARGS='--algo ppo --total-timesteps 50000'"
	@echo ""
	@echo "Local sweep agent from this repo:"
	@echo "  make train.agent SWEEP_ID=entity/project/id AGENT_COUNT=5"
	@echo ""
	@echo "Bootstrap private repo worker from anywhere:"
	@echo "  make train.bootstrap REPO_URL=https://github.com/org/repo.git BRANCH=main SWEEP_ID=entity/project/id"
	@echo ""
	@echo "Config source: $(SWEEP_ENV_FILE) (auto-loaded)"

$(BUILDDIR):
	mkdir -p paper/$(BUILDDIR)

.PHONY: pdf.build
pdf.build:
	@$(NX) run paper:build

.PHONY: pdf.watch
pdf.watch:
	@$(NX) run paper:watch

.PHONY: pdf.clean
pdf.clean:
	@$(NX) run paper:clean

.PHONY: pdf.genpop
pdf.genpop:
	@bash scripts/nx_paper.sh build-genpop

.PHONY: pdf.genpop.watch
pdf.genpop.watch:
	@bash scripts/nx_paper.sh watch-genpop

.PHONY: test.backend
test.backend:
	@$(NX) run research:test

.PHONY: test.e2e
test.e2e:
	@$(NX) run e2e:test

.PHONY: test.all
test.all:
	@$(NX) run-many -t test --projects=research,e2e --parallel=1

.PHONY: web.dev
web.dev:
	@$(NX) run web:dev

$(VENV):
	python3 -m venv $(VENV)
	$(PIP) install --upgrade pip

.PHONY: install
install:
	@$(NX) run research:install

.PHONY: train
train:
	@WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train

.PHONY: train.agent
train.agent:
	@WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-agent

.PHONY: train.bootstrap
train.bootstrap:
	@WANDB_ENTITY="$(WANDB_ENTITY)" WANDB_PROJECT="$(WANDB_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" REPO_URL="$(REPO_URL)" BRANCH="$(BRANCH)" WORKDIR="$(WORKDIR)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" AGENT_LOOP="$(AGENT_LOOP)" RETRY_SECONDS="$(RETRY_SECONDS)" $(NX) run research:train-bootstrap

.PHONY: stats.lines
stats.lines:
	@$(NX) run research:stats

.PHONY: wordcount
wordcount:
	@$(NX) run paper:wordcount

.PHONY: docker.train.publish
docker.train.publish:
	@TRAIN_IMAGE_REF="$(TRAIN_IMAGE_REF)" $(NX) run research:docker-train-publish

.PHONY: train.tpu.pod
train.tpu.pod:
	@TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-tpu-pod

.PHONY: train.tpu.vm.prepare
train.tpu.vm.prepare:
	@TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" $(NX) run research:train-tpu-vm-prepare

.PHONY: train.tpu.vm.run
train.tpu.vm.run:
	@TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train-tpu-vm-run

.PHONY: train.tpu.vm
train.tpu.vm:
	@TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" LOCAL_TRAIN_ARGS="$(LOCAL_TRAIN_ARGS)" $(NX) run research:train-tpu-vm

.PHONY: train.tpu.vm.sweep
train.tpu.vm.sweep:
	@TPU_NAME="$(TPU_NAME)" TPU_ZONE="$(TPU_ZONE)" TPU_PROJECT="$(TPU_PROJECT)" TPU_REPO_DIR="$(TPU_REPO_DIR)" SWEEP_ENV_FILE="$(SWEEP_ENV_FILE)" SWEEP_ID="$(SWEEP_ID)" AGENT_COUNT="$(AGENT_COUNT)" $(NX) run research:train-tpu-vm-sweep

.PHONY: backend.server backend.provider backend.worker platform.up platform.down platform.logs
backend.server:
	@$(NX) run backend-server:dev

backend.provider:
	@$(NX) run pricing-provider:dev

backend.worker:
	@$(NX) run backend-worker:dev

platform.up:
	@$(NX) run platform:up

platform.down:
	@$(NX) run platform:down

platform.logs:
	@$(NX) run platform:logs

.PHONY: pdf clean watch run.webapp test count-lines all
pdf:
	@$(NX) run paper:build

clean:
	@$(NX) run paper:clean

watch:
	@$(NX) run paper:watch

run.webapp:
	@$(NX) run web:dev

test:
	@$(NX) run research:test

count-lines:
	@$(NX) run research:stats

all:
	@$(NX) run paper:build
