#!/bin/bash
# Over the hard cap fails; over the soft budget only warns, see AGENTS.md "File budget".
set -u

soft_rust=250; hard_rust=400
soft_qml=250;  hard_qml=400
soft_js=200;   hard_js=300

# Recorded debts and scoped release exceptions retain exact per-file ceilings; global limits stay unchanged.
known_over_cap="shelf/Model.js 655
shelf/Panel.qml 430
shelf/ShelfCard.qml 443
shelf/ShelfService.qml 481
src/backend/localsend.rs 403
src/backend/menu_actions.rs 560
src/backend/menu_registry.rs 563
src/backend/metareq.rs 404
src/backend/opsdispatch.rs 536
src/backend/opsreq/tests.rs 424
src/backend/proto.rs 466
src/backend/run.rs 427
src/backend/thumbs.rs 441
src/backend/thumbworker.rs 953
src/backend/trashbrowse.rs 698
src/backend/trashdelete.rs 895
src/tui/actions.rs 1021
src/tui/input.rs 449
src/tui/model.rs 1196
src/tui/render.rs 807
src/uistate.rs 442
src/uistore.rs 483
src/vulkan.rs 620
tests/js/focus.js 374
tests/js/mounts.js 383
tests/js/ops.js 384
ui/Backend.qml 435
ui/ChromeBar.qml 421
ui/ContextMenu.qml 534
ui/ConvertDialog.qml 440
ui/Ipc.qml 791
ui/NetworkDialog.qml 449
ui/NetworkMounts.qml 560
ui/OpenWithDialog.qml 588
ui/Pane.qml 648
ui/PaneMenuActions.qml 404
ui/PaneWire.qml 485
ui/PermissionsDialog.qml 426
ui/PickerWindow.qml 676
ui/PreviewColumn.qml 477
ui/Row.qml 421
ui/SettingsPanel.qml 542
ui/SettingsRow.qml 410
ui/Sidebar.qml 543
ui/TrashView.qml 466
ui/WindowBody.qml 485
ui/js/Filter.js 301
ui/js/Focus.js 341
ui/js/Keymap.js 313
ui/js/Ops.js 331
ui/js/Settings.js 427"

status=0

budget_for() {
  case "$1" in
    *.rs)  echo "$soft_rust $hard_rust" ;;
    *.qml) echo "$soft_qml $hard_qml" ;;
    *.js)  echo "$soft_js $hard_js" ;;
    *)     echo "" ;;
  esac
}

while IFS= read -r file; do
  budgets=$(budget_for "$file")
  [ -z "$budgets" ] && continue
  soft=${budgets% *}
  hard=${budgets#* }
  lines=$(wc -l < "$file")
  if [ "$lines" -gt "$hard" ]; then
    recorded=$(printf '%s\n' "$known_over_cap" | awk -v f="$file" '$1 == f { print $2 }')
    if [ -n "$recorded" ]; then
      if [ "$lines" -gt "$recorded" ]; then
        echo "GREW      $file: $lines lines, recorded $recorded, cap $hard"
        status=1
      else
        echo "known     $file: $lines lines, recorded $recorded, cap $hard"
      fi
      continue
    fi
    echo "OVER CAP  $file: $lines lines, cap $hard"
    status=1
  elif [ "$lines" -gt "$soft" ]; then
    echo "over soft $file: $lines lines, budget $soft, split it"
  fi
done < <(find src ui shelf tests -type f \( -name '*.rs' -o -name '*.qml' -o -name '*.js' \) 2>/dev/null)

exit $status
