#!/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 669
shelf/Panel.qml 430
shelf/ShelfCard.qml 443
shelf/ShelfService.qml 481
src/backend/copyfile.rs 524
src/backend/copyfile_tests.rs 460
src/backend/durable.rs 662
src/backend/durable_tests.rs 1248
src/backend/fsinforeq.rs 407
src/backend/jump_tests.rs 403
src/backend/renamecompat.rs 447
src/backend/gvfslist.rs 549
src/backend/imagesize.rs 475
src/backend/localsend.rs 405
src/backend/menu_actions.rs 560
src/backend/menu_registry.rs 563
src/backend/meta.rs 436
src/backend/metareq.rs 416
src/backend/movebatch.rs 469
src/backend/movebatch_tests.rs 751
src/backend/opsdispatch.rs 540
src/backend/opsreq.rs 513
src/backend/opsreq/tests.rs 461
src/backend/proto.rs 287
src/backend/run.rs 448
src/backend/thumbs.rs 442
src/backend/thumbworker.rs 953
src/backend/trashbrowse.rs 698
src/backend/trashdelete.rs 901
src/gui.rs 501
src/tui/actions.rs 1021
src/tui/input.rs 449
src/tui/model.rs 1247
src/tui/render.rs 889
src/uischema.rs 421
src/uistate.rs 625
src/uistore.rs 540
src/vulkan.rs 728
tests/js/columns.js 618
tests/js/focus.js 456
tests/js/mounts.js 383
tests/js/network.js 306
tests/js/ops.js 390
tests/columnrow-geom.qml 409
tests/columnscost.qml 416
tests/columnsfolder.qml 396
tests/js/status.js 354
ui/Backend.qml 431
ui/ChromeBar.qml 478
ui/ColumnsArea.qml 459
ui/ContextMenu.qml 584
ui/ConvertDialog.qml 440
ui/Ipc.qml 818
ui/NetworkDialog.qml 449
ui/NetworkMounts.qml 838
ui/OpenWithDialog.qml 592
ui/Pane.qml 735
ui/PaneMenuActions.qml 407
ui/PaneWire.qml 468
ui/PermissionsDialog.qml 432
ui/PickerWindow.qml 706
ui/PreviewColumn.qml 499
ui/Preview.qml 463
ui/Row.qml 474
ui/SettingsPanel.qml 542
ui/SettingsRow.qml 410
ui/Sidebar.qml 567
ui/StatusBar.qml 456
ui/Theme.qml 415
ui/TrashView.qml 475
ui/WindowBody.qml 547
ui/js/Filter.js 253
ui/js/Focus.js 373
ui/js/Keymap.js 314
ui/js/Menu.js 337
ui/js/Ops.js 371
ui/js/Settings.js 432"

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
