// SPDX-License-Identifier: Apache-2.0
// Independently authored in-memory seeds; no external model redistribution.

///|
fn obj_seed() -> String {
  "v 0 0 0\nv 1 0 0\nv 0 1 0\nf 1 2 3\n"
}

///|
fn ply_seed() -> String {
  "ply\nformat ascii 1.0\nelement vertex 3\nproperty float x\nproperty float y\nproperty float z\nelement face 1\nproperty list uchar int vertex_indices\nend_header\n0 0 0 1 0 0 0 1 0 3 0 1 2\n"
}

///|
fn model_seed(extra~ : String = "") -> String {
  "" +
  extra +
  ""
}

///|
fn zip_seed(model : String) -> Bytes {
  let entries = [
    ("3D/3dmodel.model", @utf8.encode(model).to_fixedarray()),
    (
      "_rels/.rels",
      @utf8.encode(
        "",
      ).to_fixedarray(),
    ),
    (
      "[Content_Types].xml",
      @utf8.encode(
        "",
      ).to_fixedarray(),
    ),
  ]
  Bytes::from_array(
    @fzip.zip_sync(entries, opts={
      ..@fzip.ZipEntryOptions::default(),
      level: 0,
    }),
  )
}

///|
fn seeds() -> Array[Bytes] {
  let mesh = @stlkit.parse_obj(obj_seed()).unwrap()
  [
    @stlkit.write_stl_binary(mesh),
    @utf8.encode(@stlkit.write_stl_ascii(mesh, "fuzz")),
    @utf8.encode(obj_seed()),
    @utf8.encode(ply_seed()),
    zip_seed(model_seed()),
  ]
}

///|
fn targeted_seed(kind : Int32, iteration : Int32) -> Bytes {
  match kind {
    0 => {
      let bytes = @stlkit.write_stl_binary(
        @stlkit.parse_obj(obj_seed()).unwrap(),
      ).to_fixedarray()
      let prefix = if iteration / 50 % 2 == 0 {
        b"PK\x03\x04"
      } else {
        b"ply\n"
      }
      for i in 0..
      @utf8.encode(
        "solid\nfacet normal 0 0 1\nouter loop\nvertex 1e309 0 0\nendloop\nendfacet\nendsolid\n",
      )
    2 =>
      @utf8.encode(
        obj_seed() +
        (if iteration % 2 == 0 {
          "f 2147483647 0 -2147483648\n"
        } else {
          "v 1e308 1e308 1e308\nf 1 2 4\n"
        }),
      )
    3 =>
      @utf8.encode(
        ply_seed().replace_all(
          old="element face 1",
          new="element empty 2147483647\nelement face 1",
        ),
      )
    _ => zip_seed(model_seed(extra=""))
  }
}