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 = {
  Anchor: (
    _raw: [number | string, number, number],
    _socket: VScript.VSocket,
  ): Anchor => {
    return {
      t: VScript.VAPIHelpers.liftTimestamp(_raw[0], _socket),
      y: _raw[1],
      micro_epoch_index: _raw[2],
    };
  },
  GenlockPosition: (
    _raw: [[number, number, number, number], [number, number, number, number]],
    _socket: VScript.VSocket,
  ): GenlockPosition => {
    return {
      drift_from_frc: VAPI.Time.lift.TimestampedDrift(_raw[0], _socket),
      offset_from_ptp: VAPI.Time.lift.TimestampedOffset(_raw[1], _socket),
    };
  },
  SingleGenlockSettings: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new SingleGenlockSettings(_raw),
} as const;
export const lower = {
  Anchor: (
    _x: {
      t: VAPI.Primitives.Timestamp;
      y: VAPI.Genlock.Samplecount;
      micro_epoch_index: VAPI.Time.MicroEpochIndex;
    },
    _socket: VScript.VSocket,
  ): [number | string, number, number] => [
    VScript.VAPIHelpers.lowerTimestamp(_x.t, _socket),
    _x.y,
    _x.micro_epoch_index,
  ],
  GenlockPosition: (
    _x: {
      drift_from_frc: VAPI.Time.TimestampedDrift;
      offset_from_ptp: VAPI.Time.TimestampedOffset;
    },
    _socket: VScript.VSocket,
  ): [[number, number, number, number], [number, number, number, number]] => [
    VAPI.Time.lower.TimestampedDrift(_x.drift_from_frc, _socket),
    VAPI.Time.lower.TimestampedOffset(_x.offset_from_ptp, _socket),
  ],
  SingleGenlockSettings: (_x: SingleGenlockSettings) => _x.raw.kwl,
} as const;
export interface Anchor {
  t: VAPI.Primitives.Timestamp;
  y: VAPI.Genlock.Samplecount;
  micro_epoch_index: VAPI.Time.MicroEpochIndex;
}
export type AudioClockLane = "a48kHz" | "a96kHz";
export interface GenlockPosition {
  drift_from_frc: VAPI.Time.TimestampedDrift;
  offset_from_ptp: VAPI.Time.TimestampedOffset;
}
export type Samplecount = number;
export class SingleGenlockSettings
  implements VScript.Referenceable<"Genlock::Data::SingleGenlockSettings">
{
  readonly type_identifier = "Genlock::Data::SingleGenlockSettings" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  get servo(): VScript.dKeyword<
    VScript.VSocket,
    [
      [
        [number, number, number, number, number],
        [number, number],
        [number, number, number, number],
        [number, number],
      ],
      [
        [number, number, number, number, number],
        [number, number],
        [number, number, number, number],
        [number, number],
      ],
      VAPI.Servos.LockingPolicy,
      [number, number],
      number,
      VAPI.Servos.OnCalibrationTimeout,
    ],
    [
      [
        [number, number, number, number, number],
        [number, number],
        [number, number, number, number],
        [number, number],
      ],
      [
        [number, number, number, number, number],
        [number, number],
        [number, number, number, number],
        [number, number],
      ],
      VAPI.Servos.LockingPolicy,
      [number, number],
      number,
      VAPI.Servos.OnCalibrationTimeout,
    ],
    VAPI.Servos.Settings,
    VAPI.Servos.Settings,
    VAPI.Genlock.SingleGenlockSettings
  > {
    return new VScript.dKeyword<
      VScript.VSocket,
      [
        [
          [number, number, number, number, number],
          [number, number],
          [number, number, number, number],
          [number, number],
        ],
        [
          [number, number, number, number, number],
          [number, number],
          [number, number, number, number],
          [number, number],
        ],
        VAPI.Servos.LockingPolicy,
        [number, number],
        number,
        VAPI.Servos.OnCalibrationTimeout,
      ],
      [
        [
          [number, number, number, number, number],
          [number, number],
          [number, number, number, number],
          [number, number],
        ],
        [
          [number, number, number, number, number],
          [number, number],
          [number, number, number, number],
          [number, number],
        ],
        VAPI.Servos.LockingPolicy,
        [number, number],
        number,
        VAPI.Servos.OnCalibrationTimeout,
      ],
      VAPI.Servos.Settings,
      VAPI.Servos.Settings,
      VAPI.Genlock.SingleGenlockSettings
    >(
      this,
      "servo" as VScript.SysName,
      {
        lift: VAPI.Servos.lift.Settings,
        lower: VAPI.Servos.lower.Settings,
      },
      {
        lift: VAPI.Servos.lift.Settings,
        lower: VAPI.Servos.lower.Settings,
      },
      null,
    );
  }
  get decalibrate_on_input_change(): VScript.rwKeyword<
    VScript.VSocket,
    boolean,
    boolean,
    boolean,
    boolean,
    VAPI.Genlock.SingleGenlockSettings
  > {
    return new VScript.rwKeyword<
      VScript.VSocket,
      boolean,
      boolean,
      boolean,
      boolean,
      VAPI.Genlock.SingleGenlockSettings
    >(
      this,
      "decalibrate_on_input_change" as VScript.SysName,
      {
        lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
        lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
      },
      {
        lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
        lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
      },
      null,
    );
  }
}
export type VideoClockLane = "f50_ish" | "f59_ish";
export const Enums = {
  VideoClockLane: ["f50_ish", "f59_ish"] as VideoClockLane[],
  AudioClockLane: ["a48kHz", "a96kHz"] as AudioClockLane[],
} as const;
