///|
pub fn is_named_budget_profile(name : String) -> Bool {
  name == "default" || name == "tight" || name == "large" || name == "tiny"
}

///|
pub fn render_budget_for_profile(name : String) -> @core.RenderBudget {
  match name {
    "default" => @core.default_render_budget()
    "tight" =>
      @core.render_budget(
        max_nodes=128,
        max_depth=12,
        max_events=32,
        max_initial_data_bytes=4096,
        max_unwindowed_list_children=16,
        max_scene_markers=64,
        max_scene_regions=32,
        max_scene_assets=16,
        max_degraded_scenes=0,
      )
    "large" =>
      @core.render_budget(
        max_nodes=1024,
        max_depth=16,
        max_events=128,
        max_initial_data_bytes=49152,
        max_unwindowed_list_children=64,
        max_scene_markers=256,
        max_scene_regions=128,
        max_scene_assets=64,
        max_degraded_scenes=0,
      )
    "tiny" =>
      @core.render_budget(
        max_nodes=8,
        max_depth=2,
        max_events=1,
        max_initial_data_bytes=64,
        max_unwindowed_list_children=0,
        max_scene_markers=1,
        max_scene_regions=1,
        max_scene_assets=0,
        max_degraded_scenes=0,
      )
    _ => panic()
  }
}

///|
pub fn wechat_build_budget_for_profile(
  name : String,
) -> @wechat.WechatBuildBudget {
  match name {
    "default" => @wechat.default_build_budget()
    "tight" =>
      @wechat.build_budget(
        max_pages=4,
        max_files=16,
        max_total_bytes=32768,
        max_wxml_bytes=16384,
        max_wxss_bytes=8192,
        max_js_bytes=16384,
        max_initial_data_bytes=1024,
        max_event_patch_bytes=1024,
        max_event_patch_operations=32,
        max_page_first_screen_bytes=24576,
        max_page_update_payload_bytes=1024,
        max_page_update_operations=16,
      )
    "large" =>
      @wechat.build_budget(
        max_pages=16,
        max_files=96,
        max_total_bytes=2 * 1024 * 1024,
        max_wxml_bytes=512 * 1024,
        max_wxss_bytes=256 * 1024,
        max_js_bytes=1024 * 1024,
        max_initial_data_bytes=128 * 1024,
        max_event_patch_bytes=64 * 1024,
        max_event_patch_operations=256,
        max_page_first_screen_bytes=256 * 1024,
        max_page_update_payload_bytes=8192,
        max_page_update_operations=96,
      )
    "tiny" =>
      @wechat.build_budget(
        max_pages=1,
        max_files=1,
        max_total_bytes=128,
        max_wxml_bytes=128,
        max_wxss_bytes=128,
        max_js_bytes=128,
        max_initial_data_bytes=4,
        max_event_patch_bytes=4,
        max_event_patch_operations=1,
        max_page_first_screen_bytes=4,
        max_page_update_payload_bytes=4,
        max_page_update_operations=1,
      )
    _ => panic()
  }
}

///|
pub fn inspection_budget_for_profile(name : String) -> ProjectInspectionBudget {
  match name {
    "default" =>
      inspection_budget(
        max_route_risk_score=250000,
        max_update_payload_bytes=8192,
        max_update_operations=64,
        max_unwindowed_list_children=64,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_backend_events=64,
        max_backend_streams=16,
        max_backend_reviews=16,
        max_backend_cancels=16,
        max_backend_retries=16,
        max_scene_assets=64,
        max_scene_remote_assets=16,
        max_scene_package_bytes=1024 * 1024,
      )
    "tight" =>
      inspection_budget(
        max_route_risk_score=50000,
        max_update_payload_bytes=1024,
        max_update_operations=16,
        max_unwindowed_list_children=16,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_backend_events=16,
        max_backend_streams=4,
        max_backend_reviews=8,
        max_backend_cancels=8,
        max_backend_retries=8,
        max_scene_assets=16,
        max_scene_remote_assets=4,
        max_scene_package_bytes=256 * 1024,
      )
    "large" =>
      inspection_budget(
        max_route_risk_score=300000,
        max_update_payload_bytes=8192,
        max_update_operations=96,
        max_unwindowed_list_children=64,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_backend_events=96,
        max_backend_streams=16,
        max_backend_reviews=32,
        max_backend_cancels=16,
        max_backend_retries=16,
        max_scene_assets=64,
        max_scene_remote_assets=16,
        max_scene_package_bytes=2 * 1024 * 1024,
      )
    "tiny" =>
      inspection_budget(
        max_route_risk_score=1000,
        max_update_payload_bytes=0,
        max_update_operations=0,
        max_unwindowed_list_children=0,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_backend_events=0,
        max_backend_streams=0,
        max_backend_reviews=0,
        max_backend_cancels=0,
        max_backend_retries=0,
        max_scene_assets=0,
        max_scene_remote_assets=0,
        max_scene_package_bytes=0,
      )
    _ => panic()
  }
}

///|
pub fn miniapp_inspection_budget_for_profile(
  name : String,
) -> MiniappInspectionBudget {
  match name {
    "default" =>
      miniapp_inspection_budget(
        max_pages=8,
        max_files=32,
        max_total_bytes=131072,
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_nodes=512,
        max_depth=16,
        max_events=96,
        max_scene_markers=256,
        max_scene_regions=128,
        max_scene_assets=64,
      )
    "tight" =>
      miniapp_inspection_budget(
        max_pages=4,
        max_files=16,
        max_total_bytes=32768,
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_nodes=128,
        max_depth=12,
        max_events=32,
        max_scene_markers=64,
        max_scene_regions=32,
        max_scene_assets=16,
      )
    "large" =>
      miniapp_inspection_budget(
        max_pages=16,
        max_files=96,
        max_total_bytes=2 * 1024 * 1024,
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_nodes=1024,
        max_depth=16,
        max_events=128,
        max_scene_markers=256,
        max_scene_regions=128,
        max_scene_assets=64,
      )
    "tiny" =>
      miniapp_inspection_budget(
        max_pages=1,
        max_files=1,
        max_total_bytes=128,
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_nodes=8,
        max_depth=2,
        max_events=1,
        max_scene_markers=1,
        max_scene_regions=1,
        max_scene_assets=0,
      )
    _ => panic()
  }
}

///|
pub fn build_profile_budget_for_profile(name : String) -> BuildProfileBudget {
  match name {
    "default" =>
      build_profile_budget(
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_unwindowed_list_children=64,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_communication_unresolved_reviews=16,
        max_tool_result_missing_acks=0,
        max_agent_duplicate_stream_chunks=0,
        max_snapshot_full_replaces=1,
        max_scene_thread_orphans=0,
        max_scene_camera_clamped=0,
        max_scene_surface_fallbacks=4,
        max_scene_insecure_remote_assets=0,
        max_scene_unapproved_remote_assets=0,
        max_scene_deferred_assets=0,
        max_scene_quality_issues=0,
        max_degraded_scenes=0,
      )
    "tight" =>
      build_profile_budget(
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_unwindowed_list_children=16,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_communication_unresolved_reviews=8,
        max_tool_result_missing_acks=0,
        max_agent_duplicate_stream_chunks=0,
        max_snapshot_full_replaces=0,
        max_scene_thread_orphans=0,
        max_scene_camera_clamped=0,
        max_scene_surface_fallbacks=0,
        max_scene_insecure_remote_assets=0,
        max_scene_unapproved_remote_assets=0,
        max_scene_deferred_assets=0,
        max_scene_quality_issues=0,
        max_degraded_scenes=0,
      )
    "large" =>
      build_profile_budget(
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_unwindowed_list_children=64,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_communication_unresolved_reviews=16,
        max_tool_result_missing_acks=0,
        max_agent_duplicate_stream_chunks=0,
        max_snapshot_full_replaces=1,
        max_scene_thread_orphans=0,
        max_scene_camera_clamped=0,
        max_scene_surface_fallbacks=4,
        max_scene_insecure_remote_assets=0,
        max_scene_unapproved_remote_assets=0,
        max_scene_deferred_assets=0,
        max_scene_quality_issues=0,
        max_degraded_scenes=0,
      )
    "tiny" =>
      build_profile_budget(
        max_route_diagnostic_routes=0,
        max_route_diagnostics=0,
        max_unwindowed_list_children=0,
        max_unkeyed_list_children=0,
        max_duplicate_list_keys=0,
        max_communication_unresolved_reviews=0,
        max_tool_result_missing_acks=0,
        max_agent_duplicate_stream_chunks=0,
        max_snapshot_full_replaces=0,
        max_scene_thread_orphans=0,
        max_scene_camera_clamped=0,
        max_scene_surface_fallbacks=0,
        max_scene_insecure_remote_assets=0,
        max_scene_unapproved_remote_assets=0,
        max_scene_deferred_assets=0,
        max_scene_quality_issues=0,
        max_degraded_scenes=0,
      )
    _ => panic()
  }
}