interface StringOptions {
  id?: number;
  encoded?: boolean;
}

interface ItemDefinition {
  [key: string]: any;
  id?: number;
  flags?: number;
  flagsCategory?: number;
  type?: number;
  materialType?: number;
  name?: string;
  texture?: string;
  textureHash?: number;
  visualEffectType?: number;
  flags2?: number;
  textureX?: number;
  textureY?: number;
  storageType?: number;
  isStripeyWallpaper?: number;
  collisionType?: number;
  breakHits?: number;
  resetStateAfter?: number;
  bodyPartType?: number;
  blockType?: number;
  growTime?: number;
  rarity?: number;
  maxAmount?: number;
  extraFile?: string;
  extraFileHash?: number;
  audioVolume?: number;
  petName?: string;
  petPrefix?: string;
  petSuffix?: string;
  petAbility?: string;
  seedBase?: number;
  seedOverlay?: number;
  treeBase?: number;
  treeLeaves?: number;
  seedColor?: number;
  seedOverlayColor?: number;
  isMultiFace?: number;
  isRayman?: number;
  extraOptions?: string;
  texture2?: string;
  extraOptions2?: string;
  punchOptions?: string;

  extraBytes?: number[];

  // new options
  ingredient?: number;
  flags3?: number;
  flags4?: number;
  bodyPart?: number[];
  flags5?: number;
  extraTexture?: string;
  itemRenderer?: string;
  unknownInt1?: number; // NOTE: not sure what this does
  unknownBytes1?: number[]; // NOTE: not sure what this does
  extraFlags1?: number; // NOTE: not sure what this does
  extraHash1?: number; // NOTE: not sure what this does
  unknownBytes2?: number[]; // NOTE: not sure what this does
  unknownShort1?: number; // NOTE: not sure what this does
}

interface ItemsDatMeta {
  version?: number;
  itemCount?: number;
  items: ItemDefinition[];
}

declare class ExtendBuffer {
    mempos: number;
    data: number[];
    constructor(data: number[] | number, mempos?: number);
    private read;
    private readSigned;
    private write;
    readU8: () => number;
    readU16: (be?: boolean) => number;
    readU32: (be?: boolean) => number;
    readI8: () => number;
    readI16: (be?: boolean) => number;
    readI32: (be?: boolean) => number;
    private readBE;
    private readSignedBE;
    writeU8: (value: number) => void;
    writeU16: (value: number, be?: boolean) => void;
    writeU32: (value: number, be?: boolean) => void;
    writeI8: (value: number) => void;
    writeI16: (value: number, be?: boolean) => void;
    writeI32: (value: number, be?: boolean) => void;
    private writeBE;
    writeU: (size: number, value: number, be?: boolean) => void;
    writeI: (size: number, value: number, be?: boolean) => void;
    readString(be?: boolean): Promise<string>;
    writeString(str: string, be?: boolean): Promise<void>;
}

declare class ItemsDat {
    buffer: ExtendBuffer;
    private key;
    private stringFields;
    meta: ItemsDatMeta;
    constructor(data: number[] | number);
    private getWriteSize;
    decode(): Promise<void>;
    encode(): Promise<void>;
    private readString;
    private writeString;
}

export { ExtendBuffer, type ItemDefinition, ItemsDat, type ItemsDatMeta, type StringOptions };
