import * as VScript from "http://172.16.0.12/bladerunner_sdk/vscript@2.5.2/deno/release/mod.ts";
import * as VAPI from "./mod.ts";
export const lift = {
  FileInfo: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new FileInfo(_raw),
  FileProperties: (
    _raw: [
      number | string,
      VAPI.PCap.TimeResolution,
      number,
      number,
      number,
      number,
      number,
      number,
      number,
    ],
    _socket: VScript.VSocket,
  ): FileProperties => {
    return {
      uploaded_at: VScript.VAPIHelpers.liftTimestamp(_raw[0], _socket),
      time_resolution: _raw[1],
      packets_included: _raw[2],
      packets_skipped: _raw[3],
      packets_reordered: _raw[4],
      intervals_shortened: _raw[5],
      total_length: VScript.VAPIHelpers.liftNanoseconds(_raw[6], _socket),
      warnings_generated_during_upload: _raw[7],
      last_burstgroup: _raw[8],
    };
  },
  IGMPMembership: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new IGMPMembership(_raw),
  MemoryRange: (
    _raw: [number, number, number],
    _socket: VScript.VSocket,
  ): MemoryRange => {
    return {
      start: _raw[0],
      stop: _raw[1],
      fill_level: _raw[2],
    };
  },
  SrcDstPair: (
    _raw: [null | string, null | string],
    _socket: VScript.VSocket,
  ): SrcDstPair => {
    return {
      src: _raw[0],
      dst: _raw[1],
    };
  },
  InstancePendingDmaTransfers: (
    _raw: [number, number],
    _socket: VScript.VSocket,
  ): InstancePendingDmaTransfers => {
    return {
      downloads: _raw[0],
      uploads: _raw[1],
    };
  },
} as const;
export const lower = {
  FileInfo: (_x: FileInfo) => _x.raw.kwl,
  FileProperties: (
    _x: {
      uploaded_at: VAPI.Primitives.Timestamp;
      time_resolution: VAPI.PCap.TimeResolution;
      packets_included: VAPI.Primitives.Unsigned64;
      packets_skipped: VAPI.Primitives.Unsigned64;
      packets_reordered: VAPI.Primitives.Unsigned64;
      intervals_shortened: VAPI.Primitives.Unsigned64;
      total_length: VScript.Duration;
      warnings_generated_during_upload: VAPI.Primitives.Unsigned64;
      last_burstgroup: VAPI.Primitives.Unsigned64;
    },
    _socket: VScript.VSocket,
  ): [
    number | string,
    VAPI.PCap.TimeResolution,
    number,
    number,
    number,
    number,
    number,
    number,
    number,
  ] => [
    VScript.VAPIHelpers.lowerTimestamp(_x.uploaded_at, _socket),
    _x.time_resolution,
    _x.packets_included,
    _x.packets_skipped,
    _x.packets_reordered,
    _x.intervals_shortened,
    VScript.VAPIHelpers.lowerNanoseconds(_x.total_length, _socket),
    _x.warnings_generated_during_upload,
    _x.last_burstgroup,
  ],
  IGMPMembership: (_x: IGMPMembership) => _x.raw.kwl,
  MemoryRange: (
    _x: {
      start: VAPI.PCap.MemoryAddress;
      stop: VAPI.PCap.MemoryAddress;
      fill_level: number;
    },
    _socket: VScript.VSocket,
  ): [number, number, number] => [_x.start, _x.stop, _x.fill_level],
  SrcDstPair: (
    _x: { src: null | string; dst: null | string },
    _socket: VScript.VSocket,
  ): [null | string, null | string] => [_x.src, _x.dst],
  InstancePendingDmaTransfers: (
    _x: {
      downloads: VAPI.Primitives.Unsigned16;
      uploads: VAPI.Primitives.Unsigned16;
    },
    _socket: VScript.VSocket,
  ): [number, number] => [_x.downloads, _x.uploads],
} as const;
export type DMAMode = "Download" | "Upload";
export type Delay = VScript.Duration;
export type FileFormat = "PCap" | "Raw";
export class FileInfo implements VScript.Referenceable<"PCap::Data::FileInfo"> {
  readonly type_identifier = "PCap::Data::FileInfo" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  get filename(): VScript.rKeyword<
    VScript.VSocket,
    string,
    string,
    VAPI.PCap.FileInfo
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      string,
      string,
      VAPI.PCap.FileInfo
    >(this, "filename" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get properties(): VScript.rKeyword<
    VScript.VSocket,
    | null
    | [
        number | string,
        VAPI.PCap.TimeResolution,
        number,
        number,
        number,
        number,
        number,
        number,
        number,
      ],
    null | VAPI.PCap.FileProperties,
    VAPI.PCap.FileInfo
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      | null
      | [
          number | string,
          VAPI.PCap.TimeResolution,
          number,
          number,
          number,
          number,
          number,
          number,
          number,
        ],
      null | VAPI.PCap.FileProperties,
      VAPI.PCap.FileInfo
    >(this, "properties" as VScript.SysName, {
      lift: VScript.VAPIHelpers.liftOrLowerNullable(
        VAPI.PCap.lift.FileProperties,
      ),
      lower: VScript.VAPIHelpers.liftOrLowerNullable(
        VAPI.PCap.lower.FileProperties,
      ),
    });
  }
}
export interface FileProperties {
  uploaded_at: VAPI.Primitives.Timestamp;
  time_resolution: VAPI.PCap.TimeResolution;
  packets_included: VAPI.Primitives.Unsigned64;
  packets_skipped: VAPI.Primitives.Unsigned64;
  packets_reordered: VAPI.Primitives.Unsigned64;
  intervals_shortened: VAPI.Primitives.Unsigned64;
  total_length: VScript.Duration;
  warnings_generated_during_upload: VAPI.Primitives.Unsigned64;
  last_burstgroup: VAPI.Primitives.Unsigned64;
}
export class IGMPMembership
  implements VScript.Referenceable<"PCap::Data::IGMPMembership">
{
  readonly type_identifier = "PCap::Data::IGMPMembership" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  get addresses(): VScript.dKeyword<
    VScript.VSocket,
    [null | string, null | string],
    [null | string, null | string],
    VAPI.PCap.SrcDstPair,
    VAPI.PCap.SrcDstPair,
    VAPI.PCap.IGMPMembership
  > {
    return new VScript.dKeyword<
      VScript.VSocket,
      [null | string, null | string],
      [null | string, null | string],
      VAPI.PCap.SrcDstPair,
      VAPI.PCap.SrcDstPair,
      VAPI.PCap.IGMPMembership
    >(
      this,
      "addresses" as VScript.SysName,
      {
        lift: VAPI.PCap.lift.SrcDstPair,
        lower: VAPI.PCap.lower.SrcDstPair,
      },
      {
        lift: VAPI.PCap.lift.SrcDstPair,
        lower: VAPI.PCap.lower.SrcDstPair,
      },
      null,
    );
  }
}
export class IGMPMembershipAsNamedTableRow extends IGMPMembership {
  readonly index: number;
  constructor(
    readonly raw: VScript.DataViews.SubtreeNamedTableRow<VScript.VSocket>,
  ) {
    super(raw);
    this.index = raw.index;
  }
  async rename(name: string, opts?: VScript.CommonWriteOptions) {
    await this.raw.rename(name, opts);
  }
  async row_name(opts?: VScript.CommonCommandOptions) {
    return await this.raw.row_name(opts);
  }
  async delete(opts?: VScript.CommonWriteOptions) {
    await this.raw.delete(opts);
  }
}
export type MemoryAddress = number;
/**
  Memory area currently holding valid pcap data
*/
export interface MemoryRange {
  start: VAPI.PCap.MemoryAddress;
  stop: VAPI.PCap.MemoryAddress;
  fill_level: number;
}
export interface SrcDstPair {
  src: null | string;
  dst: null | string;
}
export type TimeResolution = "Microseconds" | "Nanoseconds";
export interface InstancePendingDmaTransfers {
  downloads: VAPI.Primitives.Unsigned16;
  uploads: VAPI.Primitives.Unsigned16;
}
export const Enums = {
  TimeResolution: ["Microseconds", "Nanoseconds"] as TimeResolution[],
  FileFormat: ["PCap", "Raw"] as FileFormat[],
  DMAMode: ["Download", "Upload"] as DMAMode[],
} as const;
