# nr-flow-validator — Declarative Node-RED flows with conftest validation

set export

# Default: generate a flow, validate, and show results
default: validate

# ---- Flow generation ----

# Generate Node-RED flow JSON from a YAML spec
generate FLOW="zigbee-monitor":
    @echo "=== Generating {{FLOW}} ==="
    python3 scripts/flow2json.py flows/{{FLOW}}.yaml > output/{{FLOW}}.json
    @echo "Wrote output/{{FLOW}}.json"

# Generate all flows
generate-all:
    @for f in flows/*.yaml; do \
        name=$(basename "$f" .yaml); \
        just generate "$name"; \
    done

# ---- Validation ----

# Validate a generated flow against Rego policies
validate FLOW="zigbee-monitor": generate
    @echo "=== Validating {{FLOW}} ==="
    conftest test output/{{FLOW}}.json -p policy/ --namespace nodered --no-color

# Validate all flows
validate-all:
    @for f in output/*.json; do \
        echo "=== Validating $(basename "$f") ==="; \
        conftest test "$$f" -p policy/ --namespace nodered --no-color; \
    done

# ---- Deployment ----

# Deploy flow to Node-RED instance
deploy FLOW="zigbee-monitor" HOST="http://192.168.81.147:1880": generate validate
    @echo "=== Deploying {{FLOW}} to {{HOST}} ==="
    curl -s -o /dev/null -w "HTTP %{http_code}" \
        -X POST {{HOST}}/flows \
        -H "Content-Type: application/json" \
        -H "Node-RED-Deployment-Type: full" \
        -d @output/{{FLOW}}.json
    @echo ""

# Quick deploy (skip validation)
deploy-quick FLOW="zigbee-monitor" HOST="http://192.168.81.147:1880": generate
    @echo "=== Quick deploy {{FLOW}} to {{HOST}} ==="
    curl -s -o /dev/null -w "HTTP %{http_code}" \
        -X POST {{HOST}}/flows \
        -H "Content-Type: application/json" \
        -H "Node-RED-Deployment-Type: full" \
        -d @output/{{FLOW}}.json
    @echo ""

# ---- Viewing ----

# Fetch and display current flows from Node-RED
pull HOST="http://192.168.81.147:1880":
    curl -s {{HOST}}/flows | python3 -m json.tool

# Open dashboard in browser
dashboard:
    xdg-open http://192.168.81.147:1880/dashboard 2>/dev/null || open http://192.168.81.147:1880/dashboard 2>/dev/null || echo "Open: http://192.168.81.147:1880/dashboard"

# ---- Development ----

# Watch for changes and re-validate
watch FLOW="zigbee-monitor":
    @while true; do \
        inotifywait -q -e modify flows/{{FLOW}}.yaml policy/*.rego; \
        clear; just validate {{FLOW}}; \
    done

# Create a new flow from template
new NAME:
    @cp flows/zigbee-monitor.yaml flows/{{NAME}}.yaml
    @echo "Created flows/{{NAME}}.yaml — edit and run 'just validate {{NAME}}'"
