PYTHON ?= python3
PROJECT_PYTHONPATH := src:.
SMOKE_DIR := artifacts/local-smoke
RESEARCH_DIR := artifacts/research-smoke
PARITY_REPORT := artifacts/mock-parity/report.json
TUSHARE_PROVIDER ?= data/qlib/tushare-csi500-2018-2025-v2
TUSHARE_SNAPSHOT ?= artifacts/local-tushare/scoped-source-manifest.json
TUSHARE_EVIDENCE_DIR ?= artifacts/tushare

.PHONY: test architecture standard bundle smoke verify research research-verify parity parity-verify doctor secret-scan status status-check notebook-check notebook-smoke tushare-check-root tushare-snapshot tushare-build tushare-verify tushare-lineage tushare-backtest tushare-replay local

test:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m unittest discover -s tests -p '*.py' -q

architecture:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant_os architecture check

standard:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant_os standard validate
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant_os standard evaluate

bundle:
	$(PYTHON) tools/bundle_platforms.py

smoke:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant60 smoke --config configs/baseline.json --output $(SMOKE_DIR)

verify:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant60 verify-manifest $(SMOKE_DIR)/manifest.json

research:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant60 research-smoke --output $(RESEARCH_DIR)

research-verify:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant60 verify-research-manifest $(RESEARCH_DIR)/manifest.json

parity:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) tools/export_mock_parity.py export --output $(PARITY_REPORT)

parity-verify:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) tools/export_mock_parity.py verify $(PARITY_REPORT)

doctor:
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m quant_os doctor
	PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) tools/capability_probe.py

secret-scan:
	$(PYTHON) tools/check_tracked_secrets.py

status:
	$(PYTHON) tools/build_public_status.py

status-check:
	$(PYTHON) tools/build_public_status.py --check

notebook-check:
	$(PYTHON) tools/run_colab_notebook.py notebooks/quant_os_colab.ipynb

notebook-smoke:
	$(PYTHON) tools/run_colab_notebook.py notebooks/quant_os_colab.ipynb --execute

tushare-check-root:
	@test -n "$(TUSHARE_MIRROR_ROOT)" || (echo "set TUSHARE_MIRROR_ROOT=/path/to/tushare-mirror" >&2; exit 2)

tushare-snapshot: tushare-check-root
	$(PYTHON) tools/tushare_snapshot.py \
		--mirror-root "$(TUSHARE_MIRROR_ROOT)" \
		--start 2018-01-01 \
		--end 2025-12-31 \
		--apis daily adj_factor trade_cal stock_basic index_daily index_weight \
		--index-codes 000905.SH \
		--output "$(TUSHARE_SNAPSHOT)"

tushare-build: tushare-check-root
	$(PYTHON) tools/tushare_qlib.py build \
		--mirror-root "$(TUSHARE_MIRROR_ROOT)" \
		--output-dir "$(TUSHARE_PROVIDER)" \
		--start 2018-01-01 \
		--end 2025-12-31 \
		--market-name tushare_csi500 \
		--benchmark-index-code 000905.SH \
		--universe-index-code 000905.SH \
		--minimum-observations 60 \
		--ohlc-policy fail \
		--output-json "$(TUSHARE_EVIDENCE_DIR)/csi500-build.json"

tushare-verify:
	$(PYTHON) tools/tushare_qlib.py verify "$(TUSHARE_PROVIDER)" \
		--output-json "$(TUSHARE_EVIDENCE_DIR)/csi500-verify.json"

tushare-lineage:
	$(PYTHON) tools/tushare_lineage.py \
		--source-manifest "$(TUSHARE_SNAPSHOT)" \
		--provider-dir "$(TUSHARE_PROVIDER)" \
		--output-json "$(TUSHARE_EVIDENCE_DIR)/csi500-lineage.json"

tushare-backtest:
	PYTHONHASHSEED=0 PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m platforms.qlib_runner \
		--provider-uri "$(TUSHARE_PROVIDER)" \
		--market tushare_csi500 \
		--benchmark SH000905 \
		--start 2019-01-02 \
		--end 2025-12-30 \
		--feature-start 2018-01-02 \
		--lookback 20 \
		--topk 50 \
		--n-drop 5 \
		--rebalance weekly \
		--output-json "$(TUSHARE_EVIDENCE_DIR)/csi500-momentum-run-1.json"

tushare-replay: tushare-backtest
	PYTHONHASHSEED=0 PYTHONPATH=$(PROJECT_PYTHONPATH) $(PYTHON) -m platforms.qlib_runner \
		--provider-uri "$(TUSHARE_PROVIDER)" \
		--market tushare_csi500 \
		--benchmark SH000905 \
		--start 2019-01-02 \
		--end 2025-12-30 \
		--feature-start 2018-01-02 \
		--lookback 20 \
		--topk 50 \
		--n-drop 5 \
		--rebalance weekly \
		--output-json "$(TUSHARE_EVIDENCE_DIR)/csi500-momentum-run-2.json"
	cmp "$(TUSHARE_EVIDENCE_DIR)/csi500-momentum-run-1.json" \
		"$(TUSHARE_EVIDENCE_DIR)/csi500-momentum-run-2.json"

local: architecture standard test bundle smoke verify research research-verify parity parity-verify doctor secret-scan status-check notebook-check notebook-smoke
