// automatically generated by the FlatBuffers compiler, do not modify

/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */

import * as flatbuffers from 'flatbuffers';

import {InnerStruct, InnerStructT} from '../../my-game/example/inner-struct.js';

export class OuterStruct
  implements flatbuffers.IUnpackableObject<OuterStructT>
{
  bb: flatbuffers.ByteBuffer | null = null;
  bb_pos = 0;
  __init(i: number, bb: flatbuffers.ByteBuffer): OuterStruct {
    this.bb_pos = i;
    this.bb = bb;
    return this;
  }

  a(): boolean {
    return !!this.bb!.readInt8(this.bb_pos);
  }

  b(): number {
    return this.bb!.readFloat64(this.bb_pos + 8);
  }

  cUnderscore(obj?: InnerStruct): InnerStruct | null {
    return (obj || new InnerStruct()).__init(this.bb_pos + 16, this.bb!);
  }

  d(index: number, obj?: InnerStruct): InnerStruct | null {
    return (obj || new InnerStruct()).__init(
      this.bb_pos + 48 + index * 32,
      this.bb!,
    );
  }

  e(obj?: InnerStruct): InnerStruct | null {
    return (obj || new InnerStruct()).__init(this.bb_pos + 144, this.bb!);
  }

  f(index: number): number | null {
    return this.bb!.readFloat64(this.bb_pos + 176 + index * 8);
  }

  static getFullyQualifiedName(): string {
    return 'MyGame.Example.OuterStruct';
  }

  static sizeOf(): number {
    return 208;
  }

  static createOuterStruct(
    builder: flatbuffers.Builder,
    a: boolean,
    b: number,
    c_underscore_a: number,
    c_underscore_b: number[] | null,
    c_underscore_c: number,
    c_underscore_d_underscore: bigint,
    d: (any | InnerStructT)[] | null,
    e_a: number,
    e_b: number[] | null,
    e_c: number,
    e_d_underscore: bigint,
    f: number[] | null,
  ): flatbuffers.Offset {
    builder.prep(8, 208);

    for (let i = 3; i >= 0; --i) {
      builder.writeFloat64(f?.[i] ?? 0);
    }

    builder.prep(8, 32);
    builder.writeInt64(BigInt(e_d_underscore ?? 0));
    builder.pad(2);
    builder.writeInt8(e_c);

    for (let i = 12; i >= 0; --i) {
      builder.writeInt8(e_b?.[i] ?? 0);
    }

    builder.writeFloat64(e_a);

    for (let i = 2; i >= 0; --i) {
      const item = d?.[i];

      if (item instanceof InnerStructT) {
        item.pack(builder);
        continue;
      }

      InnerStruct.createInnerStruct(
        builder,
        item?.a,
        item?.b,
        item?.c,
        item?.dUnderscore,
      );
    }

    builder.prep(8, 32);
    builder.writeInt64(BigInt(c_underscore_d_underscore ?? 0));
    builder.pad(2);
    builder.writeInt8(c_underscore_c);

    for (let i = 12; i >= 0; --i) {
      builder.writeInt8(c_underscore_b?.[i] ?? 0);
    }

    builder.writeFloat64(c_underscore_a);
    builder.writeFloat64(b);
    builder.pad(7);
    builder.writeInt8(Number(Boolean(a)));
    return builder.offset();
  }

  unpack(): OuterStructT {
    return new OuterStructT(
      this.a(),
      this.b(),
      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null,
      this.bb!.createObjList<InnerStruct, InnerStructT>(this.d.bind(this), 3),
      this.e() !== null ? this.e()!.unpack() : null,
      this.bb!.createScalarList<number>(this.f.bind(this), 4),
    );
  }

  unpackTo(_o: OuterStructT): void {
    _o.a = this.a();
    _o.b = this.b();
    _o.cUnderscore =
      this.cUnderscore() !== null ? this.cUnderscore()!.unpack() : null;
    _o.d = this.bb!.createObjList<InnerStruct, InnerStructT>(
      this.d.bind(this),
      3,
    );
    _o.e = this.e() !== null ? this.e()!.unpack() : null;
    _o.f = this.bb!.createScalarList<number>(this.f.bind(this), 4);
  }
}

export class OuterStructT implements flatbuffers.IGeneratedObject {
  constructor(
    public a: boolean = false,
    public b: number = 0.0,
    public cUnderscore: InnerStructT | null = null,
    public d: InnerStructT[] = [],
    public e: InnerStructT | null = null,
    public f: number[] = [],
  ) {}

  pack(builder: flatbuffers.Builder): flatbuffers.Offset {
    return OuterStruct.createOuterStruct(
      builder,
      this.a,
      this.b,
      this.cUnderscore?.a ?? 0,
      this.cUnderscore?.b ?? [],
      this.cUnderscore?.c ?? 0,
      this.cUnderscore?.dUnderscore ?? BigInt(0),
      this.d,
      this.e?.a ?? 0,
      this.e?.b ?? [],
      this.e?.c ?? 0,
      this.e?.dUnderscore ?? BigInt(0),
      this.f,
    );
  }
}
