///|
pub fn small_cvrp_sample() -> @core.VrpInstance {
  let depot = @core.Depot::new(50.0, 50.0)
  let vehicle = @core.VehicleProfile::new(32.0, fleet_size=4)
  let customers = [
    @core.Customer::new(1, 10.0, 18.0, 6.0),
    @core.Customer::new(2, 18.0, 72.0, 8.0),
    @core.Customer::new(3, 24.0, 28.0, 5.0),
    @core.Customer::new(4, 61.0, 12.0, 7.0),
    @core.Customer::new(5, 73.0, 21.0, 9.0),
    @core.Customer::new(6, 78.0, 64.0, 6.0),
    @core.Customer::new(7, 45.0, 82.0, 4.0),
    @core.Customer::new(8, 28.0, 56.0, 5.0),
  ]
  @core.make_instance(
    "small-cvrp",
    @core.ProblemVariant::CVRP,
    depot,
    vehicle,
    customers,
  )
}

///|
pub fn urban_vrptw_sample() -> @core.VrpInstance {
  let depot = @core.Depot::new(40.0, 40.0, due_time=220.0)
  let vehicle = @core.VehicleProfile::new(
    26.0,
    fleet_size=5,
    max_route_duration=220.0,
  )
  let customers = [
    @core.Customer::new(
      1,
      12.0,
      20.0,
      4.0,
      ready_time=0.0,
      due_time=65.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      2,
      17.0,
      73.0,
      6.0,
      ready_time=25.0,
      due_time=95.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      3,
      30.0,
      18.0,
      3.0,
      ready_time=0.0,
      due_time=70.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      4,
      68.0,
      22.0,
      7.0,
      ready_time=35.0,
      due_time=120.0,
      service_time=6.0,
    ),
    @core.Customer::new(
      5,
      79.0,
      34.0,
      4.0,
      ready_time=45.0,
      due_time=145.0,
      service_time=6.0,
    ),
    @core.Customer::new(
      6,
      74.0,
      70.0,
      5.0,
      ready_time=60.0,
      due_time=165.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      7,
      58.0,
      82.0,
      4.0,
      ready_time=55.0,
      due_time=175.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      8,
      34.0,
      88.0,
      2.0,
      ready_time=30.0,
      due_time=110.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      9,
      21.0,
      52.0,
      3.0,
      ready_time=15.0,
      due_time=90.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      10,
      55.0,
      49.0,
      2.0,
      ready_time=40.0,
      due_time=150.0,
      service_time=3.0,
    ),
  ]
  @core.make_instance(
    "urban-vrptw",
    @core.ProblemVariant::VRPTW,
    depot,
    vehicle,
    customers,
  )
}

///|
pub fn balanced_dispatch_sample() -> @core.VrpInstance {
  let depot = @core.Depot::new(60.0, 60.0, due_time=260.0)
  let vehicle = @core.VehicleProfile::new(
    30.0,
    fleet_size=6,
    max_route_duration=260.0,
  )
  let customers = [
    @core.Customer::new(
      1,
      10.0,
      15.0,
      4.0,
      ready_time=0.0,
      due_time=70.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      2,
      16.0,
      26.0,
      4.0,
      ready_time=10.0,
      due_time=82.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      3,
      18.0,
      71.0,
      5.0,
      ready_time=18.0,
      due_time=102.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      4,
      29.0,
      82.0,
      3.0,
      ready_time=26.0,
      due_time=118.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      5,
      42.0,
      18.0,
      6.0,
      ready_time=0.0,
      due_time=95.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      6,
      55.0,
      16.0,
      3.0,
      ready_time=28.0,
      due_time=120.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      7,
      76.0,
      21.0,
      5.0,
      ready_time=45.0,
      due_time=150.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      8,
      83.0,
      37.0,
      4.0,
      ready_time=52.0,
      due_time=168.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      9,
      85.0,
      66.0,
      4.0,
      ready_time=65.0,
      due_time=180.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      10,
      71.0,
      84.0,
      5.0,
      ready_time=60.0,
      due_time=192.0,
      service_time=5.0,
    ),
    @core.Customer::new(
      11,
      57.0,
      91.0,
      4.0,
      ready_time=45.0,
      due_time=172.0,
      service_time=4.0,
    ),
    @core.Customer::new(
      12,
      34.0,
      90.0,
      3.0,
      ready_time=30.0,
      due_time=150.0,
      service_time=4.0,
    ),
  ]
  @core.make_instance(
    "balanced-dispatch",
    @core.ProblemVariant::VRPTW,
    depot,
    vehicle,
    customers,
  )
}

///|
pub fn sample_names() -> Array[String] {
  all_sample_names()
}

///|
pub fn sample_by_name(name : String) -> @core.VrpInstance {
  match name {
    "small-cvrp" => small_cvrp_sample()
    "urban-vrptw" => urban_vrptw_sample()
    "balanced-dispatch" => balanced_dispatch_sample()
    "micro-cvrp" => micro_cvrp_sample()
    "tight-vrptw" => tight_vrptw_sample()
    "infeasible-capacity" => infeasible_capacity_sample()
    "generated-stress" => generated_stress_sample()
    _ => small_cvrp_sample()
  }
}