.PHONY: verify safety docs-check schemas-check openapi-export openapi-check test test-gateway gateway-dev dashboard-install-check dashboard-test dashboard-build dashboard-dev handoff handoff-status handoff-stop smoke-operator-handoff demo demo-stop smoke-operator-demo smoke-local smoke-finance-live-readonly finance-live-contract-review smoke-health-local-probe smoke-health-safe-marker smoke-autoshorts-readonly e2e-local e2e-local-ui ux-acceptance visual-checklist

verify: safety docs-check schemas-check openapi-check test-gateway dashboard-test dashboard-build

safety:
	bash scripts/verify-repo-safety.sh

docs-check:
	python3 scripts/verify-repo-safety.py --docs-only

schemas-check:
	python3 -c "import json; from pathlib import Path; required=['module-snapshot.schema.json','overview-response.schema.json','module-registry-entry.schema.json','runtime-config.schema.json','error-envelope.schema.json']; [json.load(open(Path('schemas')/name, encoding='utf-8')) for name in required if (Path('schemas')/name).exists()]; missing=[name for name in required if not (Path('schemas')/name).exists()]; print('schemas checked:', len(required)); raise SystemExit('missing schemas: '+','.join(missing) if missing else 0)"

openapi-export:
	python3 scripts/export-openapi.py

openapi-check:
	python3 -c "import json; from pathlib import Path; p=Path('schemas/openapi.json'); data=json.load(open(p, encoding='utf-8')); expected=['/api/healthz','/api/modules','/api/overview','/api/demo-info','/api/activity','/api/approvals','/api/reports','/api/finance/trader-desk','/api/finance/trader-desk/scorecard','/api/finance/trader-desk/preflight','/api/redaction-policy']; missing=[x for x in expected if x not in data.get('paths', {})]; text=json.dumps(data).lower(); bad=[x for x in ['/home/agent','finance'+'.sqlite3','health'+'_data.db'] if x in text]; print('openapi paths checked:', len(expected)); raise SystemExit(('missing='+','.join(missing)+' bad='+','.join(bad)) if missing or bad else 0)"

test: test-gateway dashboard-test

test-gateway:
	cd apps/api-gateway && PYTHONPATH=. pytest -q

gateway-dev:
	cd apps/api-gateway && JARVIS_DEMO_MODE=1 PYTHONPATH=. python3 -m uvicorn jarvis_gateway.main:app --host 127.0.0.1 --port $${JARVIS_GATEWAY_PORT:-8080}

dashboard-install-check:
	cd apps/dashboard && test -d node_modules || (echo "Dashboard dependencies missing. Run: cd apps/dashboard && npm install" >&2; exit 1)

dashboard-test: dashboard-install-check
	cd apps/dashboard && npm test

dashboard-build: dashboard-install-check
	cd apps/dashboard && npm run build

dashboard-dev: dashboard-install-check
	cd apps/dashboard && npm run dev

handoff: dashboard-install-check
	bash scripts/start-operator-handoff.sh

handoff-status:
	bash scripts/handoff-status.sh

handoff-stop:
	bash scripts/stop-operator-handoff.sh

smoke-operator-handoff: dashboard-install-check
	bash scripts/smoke-operator-handoff.sh

demo: dashboard-install-check
	bash scripts/start-operator-demo.sh $${JARVIS_OPERATOR_DEMO_PROFILE:-demo_mock}

demo-stop:
	bash scripts/stop-operator-demo.sh

smoke-operator-demo: dashboard-install-check
	bash scripts/smoke-operator-demo.sh

smoke-local:
	bash scripts/smoke-local-dashboard.sh

smoke-finance-live-readonly:
	bash scripts/smoke-finance-live-readonly.sh

finance-live-contract-review: smoke-finance-live-readonly
	@echo "Review docs: docs/integrations/finance-live-contract-review.md docs/integrations/finance-sanitizer-mapping.md"

smoke-health-local-probe:
	bash scripts/smoke-health-local-probe.sh

smoke-health-safe-marker:
	bash scripts/smoke-health-safe-marker.sh

smoke-autoshorts-readonly:
	bash scripts/smoke-autoshorts-readonly.sh

e2e-local: dashboard-install-check
	bash scripts/e2e-local-dashboard.sh

e2e-local-ui: dashboard-install-check
	cd apps/dashboard && npx playwright test --ui

ux-acceptance: dashboard-install-check
	bash scripts/e2e-local-dashboard.sh ux-acceptance.spec.ts accessibility.spec.ts

visual-checklist:
	test -f docs/qa/visual-qa-checklist.md && echo "Visual QA checklist: docs/qa/visual-qa-checklist.md"
