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 = {
  AutoFader: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new AutoFader(_raw),
  BSLKMixer: (_raw: VScript.DataViews.Subtree<VScript.VSocket>) =>
    new BSLKMixer(_raw),
  AutoFaderTransition: (
    _raw: [number, number],
    _socket: VScript.VSocket,
  ): AutoFaderTransition => {
    return {
      target: _raw[0],
      time: VScript.VAPIHelpers.liftNanoseconds(_raw[1], _socket),
    };
  },
} as const;
export const lower = {
  AutoFader: (_x: AutoFader) => _x.raw.kwl,
  BSLKMixer: (_x: BSLKMixer) => _x.raw.kwl,
  AutoFaderTransition: (
    _x: {
      target: number;

      /**
            Time for a full transition from 0.0 to 1.0 - set to 0s for jump
            to target
          */
      time: VScript.Duration;
    },
    _socket: VScript.VSocket,
  ): [number, number] => [
    _x.target,
    VScript.VAPIHelpers.lowerNanoseconds(_x.time, _socket),
  ],
} as const;
export class AutoFader
  implements VScript.Referenceable<"VideoMixer::Data::AutoFader">
{
  readonly type_identifier = "VideoMixer::Data::AutoFader" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  get current(): VScript.rKeyword<
    VScript.VSocket,
    number,
    number,
    VAPI.VideoMixer.AutoFader
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      number,
      number,
      VAPI.VideoMixer.AutoFader
    >(this, "current" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
  get transition(): VScript.rwKeyword<
    VScript.VSocket,
    [number, number],
    [number, number],
    VAPI.VideoMixer.AutoFaderTransition,
    VAPI.VideoMixer.AutoFaderTransition,
    VAPI.VideoMixer.AutoFader
  > {
    return new VScript.rwKeyword<
      VScript.VSocket,
      [number, number],
      [number, number],
      VAPI.VideoMixer.AutoFaderTransition,
      VAPI.VideoMixer.AutoFaderTransition,
      VAPI.VideoMixer.AutoFader
    >(
      this,
      "transition" as VScript.SysName,
      {
        lift: VAPI.VideoMixer.lift.AutoFaderTransition,
        lower: VAPI.VideoMixer.lower.AutoFaderTransition,
      },
      {
        lift: VAPI.VideoMixer.lift.AutoFaderTransition,
        lower: VAPI.VideoMixer.lower.AutoFaderTransition,
      },
      null,
    );
  }
}
export type BSLKMode =
  | "MIXER"
  | "MIXER_INDEPENDENT"
  | "LUMA_KEYER"
  | "LUMA_KEYER_ADDITIVE";
export type BSLKIssues = {
  luma_keyer_v_src_out_of_range: boolean;
  mismatching_standards: boolean;
  missing_input: boolean;
  no_background: boolean;
  no_hw_resources: boolean;
  uhd_resources_required: boolean;
  v_src0_out_of_range: boolean;
  v_src1_out_of_range: boolean;
};
export class BSLKMixer
  implements VScript.Referenceable<"VideoMixer::Data::BSLK::Mixer">
{
  readonly type_identifier = "VideoMixer::Data::BSLK::Mixer" as const;
  constructor(readonly raw: VScript.DataViews.Subtree<VScript.VSocket>) {}
  /**
    Fader value for crossfade in MIXER mode, or for v_src0 in
    MIXER_INDEPENDENT mode
  */

  get fader0() {
    return VAPI.VideoMixer.lift.AutoFader(
      VScript.VAPIHelpers.subtree_child_checked(this.raw, 0, "fader0"),
    );
  }
  /**
    Fader value for for source1 in MIXER_INDEPENDENT mode, unused otherwise
  */

  get fader1() {
    return VAPI.VideoMixer.lift.AutoFader(
      VScript.VAPIHelpers.subtree_child_checked(this.raw, 1, "fader1"),
    );
  }

  /**
    Color mixed in when the sum of fader0 and fader1 is below 1.0 in
    MIXER_INDEPENDENT mode
  */
  get fade_via(): VScript.rwKeyword<
    VScript.VSocket,
    [number, number, number],
    [number, number, number],
    VAPI.Video.HSLCOLOUR,
    VAPI.Video.HSLCOLOUR,
    VAPI.VideoMixer.BSLKMixer
  > {
    return new VScript.rwKeyword<
      VScript.VSocket,
      [number, number, number],
      [number, number, number],
      VAPI.Video.HSLCOLOUR,
      VAPI.Video.HSLCOLOUR,
      VAPI.VideoMixer.BSLKMixer
    >(
      this,
      "fade_via" as VScript.SysName,
      {
        lift: VAPI.Video.lift.HSLCOLOUR,
        lower: VAPI.Video.lower.HSLCOLOUR,
      },
      {
        lift: VAPI.Video.lift.HSLCOLOUR,
        lower: VAPI.Video.lower.HSLCOLOUR,
      },
      null,
    );
  }

  /**
    Which input is the ANC data and V sync source
  */
  get anc_input(): VScript.rKeyword<
    VScript.VSocket,
    number,
    number,
    VAPI.VideoMixer.BSLKMixer
  > {
    return new VScript.rKeyword<
      VScript.VSocket,
      number,
      number,
      VAPI.VideoMixer.BSLKMixer
    >(this, "anc_input" as VScript.SysName, {
      lift: (x: any /* FIXME */, _: VScript.VSocket) => x,
      lower: (x: any /* FIXME */, _: VScript.VSocket) => x,
    });
  }
}
export interface AutoFaderTransition {
  target: number;

  /**
    Time for a full transition from 0.0 to 1.0 - set to 0s for jump to target
  */
  time: VScript.Duration;
}
export const Enums = {
  BSLKMode: [
    "MIXER",
    "MIXER_INDEPENDENT",
    "LUMA_KEYER",
    "LUMA_KEYER_ADDITIVE",
  ] as BSLKMode[],
} as const;
