`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;

module resource_migration_probe;
  initial begin
    uvm_resource_pool rp = uvm_resource_pool::get();
    uvm_resource#(int) r, selected, other, replacement;
    uvm_resource_base winner;
    uvm_resource_types::rsrc_q_t candidates;

    r = new("limit", "env.agent");
    r.write(42);
    $display("REVIEW|scope_before_insert|%0d", r.match_scope("env.agent"));
    selected = uvm_resource_db#(int)::get_by_name("env.agent", "limit", 0);
    $display("REVIEW|absent_before_insert|%0d", selected == null);
`ifdef REVIEW_UVM20
    rp.set_scope(r, "env.agent");
    rp.set_precedence(r, 2000);
`else
    r.set();
    r.precedence = 2000;
`endif
    selected = uvm_resource_db#(int)::get_by_name("env.agent", "limit");
    if (selected == null) `uvm_fatal("RESOURCE", "Missing resource")
    if (selected.read() != 42) `uvm_fatal("RESOURCE", "Unexpected value")
    $display("REVIEW|named_value|%0d", selected.read());
    selected = uvm_resource_db#(int)::get_by_type("env.agent");
    if (selected != r) `uvm_fatal("RESOURCE", "Unexpected resource")
    $display("REVIEW|typed_identity|%0d", selected == r);
    $display("REVIEW|precedence_after_insert|%0d", r.precedence);

    // Competing priorities: use the explicit selection described in M05-010.
    other = new("limit", "env.agent");
    other.write(99);
    rp.set(other);
    other.precedence = 1000;
    candidates = rp.lookup_name("env.agent", "limit", uvm_resource#(int)::get_type());
    winner = rp.get_highest_precedence(candidates);
    if (winner == null) `uvm_fatal("RESOURCE", "Empty selection")
    if (!$cast(selected, winner)) `uvm_fatal("RESOURCE", "Unexpected resource type")
    $display("REVIEW|highest_value|%0d", selected.read());

    // Equal priorities: a name-only override must leave type order unchanged.
    other = new("choice", "override_case");
    replacement = new("choice", "override_case");
    other.write(11); replacement.write(22);
    rp.set(other);
`ifdef REVIEW_UVM20
    rp.set_name_override(replacement, "override_case");
`else
    replacement.set_override(uvm_resource_types::NAME_OVERRIDE);
`endif
    selected = uvm_resource_db#(int)::get_by_name("override_case", "choice");
    if (selected == null) `uvm_fatal("RESOURCE", "Missing name override")
    $display("REVIEW|name_override_value|%0d", selected.read());
    selected = uvm_resource_db#(int)::get_by_type("override_case");
    if (selected == null) `uvm_fatal("RESOURCE", "Missing typed resource")
    $display("REVIEW|type_order_value|%0d", selected.read());
    $display("REVIEW|done|1");
    $finish;
  end
endmodule
