import {
  FontProperties,
  PlayerProperties,
  PositionProperties,
  SurfaceProperties,
  UIElement
} from '../models/uI-element';

// Properties check is only for backwards compatibility

const DEFAULT_DYNAMIC_POSITIONING = false;

const DEFAULT_FONT_COLOR = '#000000';
const DEFAULT_FONT = 'Roboto';
const DEFAULT_FONT_SIZE = 20;
const DEFAULT_LINE_HEIGHT = 120;
const DEFAULT_BOLD = false;
const DEFAULT_ITALIC = false;
const DEFAULT_UNDERLINE = false;

const DEFAULT_BACKGROUND_COLOR = '#d3d3d3';

export function initPositionedElement(serializedElement: Partial<UIElement>): PositionProperties {
  if (serializedElement.positionProps) {
    return {
      dynamicPositioning: serializedElement.positionProps.dynamicPositioning as boolean || DEFAULT_DYNAMIC_POSITIONING,
      xPosition: serializedElement.positionProps.xPosition !== undefined ?
        serializedElement.positionProps.xPosition as number : 0,
      yPosition: serializedElement.positionProps.yPosition !== undefined ?
        serializedElement.positionProps.yPosition as number : 0,
      useMinHeight: serializedElement.positionProps.useMinHeight !== undefined ?
        serializedElement.positionProps.useMinHeight as boolean : false,
      gridColumnStart: serializedElement.positionProps.gridColumnStart !== undefined ?
        serializedElement.positionProps.gridColumnStart as number : 1,
      gridColumnEnd: serializedElement.positionProps.gridColumnEnd !== undefined ?
        serializedElement.positionProps.gridColumnEnd as number : 2,
      gridRowStart: serializedElement.positionProps.gridRowStart !== undefined ?
        serializedElement.positionProps.gridRowStart as number : 1,
      gridRowEnd: serializedElement.positionProps.gridRowEnd !== undefined ?
        serializedElement.positionProps.gridRowEnd as number : 2,
      marginLeft: serializedElement.positionProps.marginLeft !== undefined ?
        serializedElement.positionProps.marginLeft as number : 0,
      marginRight: serializedElement.positionProps.marginRight !== undefined ?
        serializedElement.positionProps.marginRight as number : 0,
      marginTop: serializedElement.positionProps.marginTop !== undefined ?
        serializedElement.positionProps.marginTop as number : 0,
      marginBottom: serializedElement.positionProps.marginBottom !== undefined ?
        serializedElement.positionProps.marginBottom as number : 0,
      zIndex: serializedElement.positionProps.zIndex !== undefined ?
        serializedElement.positionProps.zIndex as number : 0
    };
  }
  return {
    dynamicPositioning: serializedElement.dynamicPositioning as boolean || DEFAULT_DYNAMIC_POSITIONING,
    xPosition: serializedElement.xPosition !== undefined ? serializedElement.xPosition as number : 0,
    yPosition: serializedElement.yPosition !== undefined ? serializedElement.yPosition as number : 0,
    useMinHeight: serializedElement.useMinHeight !== undefined ? serializedElement.useMinHeight as boolean : false,
    gridColumnStart: serializedElement.gridColumnStart !== undefined ? serializedElement.gridColumnStart as number : 1,
    gridColumnEnd: serializedElement.gridColumnEnd !== undefined ? serializedElement.gridColumnEnd as number : 2,
    gridRowStart: serializedElement.gridRowStart !== undefined ? serializedElement.gridRowStart as number : 1,
    gridRowEnd: serializedElement.gridRowEnd !== undefined ? serializedElement.gridRowEnd as number : 2,
    marginLeft: serializedElement.marginLeft !== undefined ? serializedElement.marginLeft as number : 0,
    marginRight: serializedElement.marginRight !== undefined ? serializedElement.marginRight as number : 0,
    marginTop: serializedElement.marginTop !== undefined ? serializedElement.marginTop as number : 0,
    marginBottom: serializedElement.marginBottom !== undefined ? serializedElement.marginBottom as number : 0,
    zIndex: serializedElement.zIndex !== undefined ? serializedElement.zIndex as number : 0
  };
}

export function initFontElement(serializedElement: Partial<UIElement>): FontProperties {
  if (serializedElement.fontProps) {
    return {
      fontColor: (serializedElement.fontProps as FontProperties).fontColor as string || DEFAULT_FONT_COLOR,
      font: (serializedElement.fontProps as FontProperties).font as string || DEFAULT_FONT,
      fontSize: (serializedElement.fontProps as FontProperties).fontSize !== undefined ?
        serializedElement.fontSize as number : DEFAULT_FONT_SIZE,
      lineHeight: (serializedElement.fontProps as FontProperties).lineHeight !== undefined ?
        serializedElement.lineHeight as number : DEFAULT_LINE_HEIGHT,
      bold: (serializedElement.fontProps as FontProperties).bold !== undefined ?
        serializedElement.bold as boolean : DEFAULT_BOLD,
      italic: (serializedElement.fontProps as FontProperties).italic !== undefined ?
        serializedElement.italic as boolean : DEFAULT_ITALIC,
      underline: (serializedElement.fontProps as FontProperties).underline !== undefined ?
        serializedElement.underline as boolean : DEFAULT_UNDERLINE
    };
  }
  return {
    fontColor: serializedElement.fontColor as string || DEFAULT_FONT_COLOR,
    font: serializedElement.font as string || DEFAULT_FONT,
    fontSize: serializedElement.fontSize !== undefined ? serializedElement.fontSize as number : DEFAULT_FONT_SIZE,
    lineHeight: serializedElement.lineHeight !== undefined ?
      serializedElement.lineHeight as number : DEFAULT_LINE_HEIGHT,
    bold: serializedElement.bold !== undefined ? serializedElement.bold as boolean : DEFAULT_BOLD,
    italic: serializedElement.italic !== undefined ? serializedElement.italic as boolean : DEFAULT_ITALIC,
    underline: serializedElement.underline !== undefined ? serializedElement.underline as boolean : DEFAULT_UNDERLINE
  };
}

export function initSurfaceElement(serializedElement: Partial<UIElement>): SurfaceProperties {
  if (serializedElement.surfaceProps) {
    return { backgroundColor: serializedElement.surfaceProps.backgroundColor as string || DEFAULT_BACKGROUND_COLOR };
  }
  return { backgroundColor: serializedElement.backgroundColor as string || DEFAULT_BACKGROUND_COLOR };
}

export function initPlayerElement(serializedElement: Partial<UIElement>): PlayerProperties {
  if (serializedElement.playerProps) {
    return {
      autostart: serializedElement.playerProps.autostart !== undefined ?
        serializedElement.playerProps.autostart as boolean : false,
      autostartDelay: serializedElement.playerProps.autostartDelay !== undefined ?
        serializedElement.playerProps.autostartDelay as number : 0,
      loop: serializedElement.playerProps.loop !== undefined ?
        serializedElement.playerProps.loop as boolean : false,
      startControl: serializedElement.playerProps.startControl !== undefined ?
        serializedElement.playerProps.startControl as boolean : true,
      pauseControl: serializedElement.playerProps.pauseControl !== undefined ?
        serializedElement.playerProps.pauseControl as boolean : false,
      progressBar: serializedElement.playerProps.progressBar !== undefined ?
        serializedElement.playerProps.progressBar as boolean : true,
      interactiveProgressbar: serializedElement.playerProps.interactiveProgressbar !== undefined ?
        serializedElement.playerProps.interactiveProgressbar as boolean : false,
      volumeControl: serializedElement.playerProps.volumeControl !== undefined ?
        serializedElement.playerProps.volumeControl as boolean : true,
      defaultVolume: serializedElement.playerProps.defaultVolume !== undefined ?
        serializedElement.playerProps.defaultVolume as number : 0.8,
      minVolume: serializedElement.playerProps.minVolume !== undefined ?
        serializedElement.playerProps.minVolume as number : 0,
      muteControl: serializedElement.playerProps.muteControl !== undefined ?
        serializedElement.playerProps.muteControl as boolean : true,
      interactiveMuteControl:
        serializedElement.playerProps.interactiveMuteControl !== undefined ?
          serializedElement.playerProps.interactiveMuteControl as boolean : false,
      hintLabel: serializedElement.playerProps.hintLabel as string || '',
      hintLabelDelay: serializedElement.playerProps.hintLabelDelay !== undefined ?
        serializedElement.playerProps.hintLabelDelay as number : 0,
      uninterruptible: serializedElement.playerProps.uninterruptible !== undefined ?
        serializedElement.playerProps.uninterruptible as boolean : false,
      hideOtherPages: serializedElement.playerProps.hideOtherPages !== undefined ?
        serializedElement.playerProps.hideOtherPages as boolean : false,
      activeAfterID: serializedElement.playerProps.activeAfterID as string || '',
      minRuns: serializedElement.playerProps.minRuns !== undefined ?
        serializedElement.playerProps.minRuns as number : 1,
      maxRuns: serializedElement.playerProps.maxRuns !== undefined ?
        serializedElement.playerProps.maxRuns as number | null : null,
      showRestRuns: serializedElement.playerProps.showRestRuns !== undefined ?
        serializedElement.playerProps.showRestRuns as boolean : false,
      showRestTime: serializedElement.playerProps.showRestTime !== undefined ?
        serializedElement.playerProps.showRestTime as boolean : true,
      playbackTime: serializedElement.playerProps.playbackTime !== undefined ?
        serializedElement.playerProps.playbackTime as number : 0
    };
  }

  return {
    autostart: serializedElement.autostart !== undefined ? serializedElement.autostart as boolean : false,
    autostartDelay: serializedElement.autostartDelay !== undefined ? serializedElement.autostartDelay as number : 0,
    loop: serializedElement.loop !== undefined ? serializedElement.loop as boolean : false,
    startControl: serializedElement.startControl !== undefined ? serializedElement.startControl as boolean : true,
    pauseControl: serializedElement.pauseControl !== undefined ? serializedElement.pauseControl as boolean : false,
    progressBar: serializedElement.progressBar !== undefined ? serializedElement.progressBar as boolean : true,
    interactiveProgressbar: serializedElement.interactiveProgressbar !== undefined ?
      serializedElement.interactiveProgressbar as boolean : false,
    volumeControl: serializedElement.volumeControl !== undefined ? serializedElement.volumeControl as boolean : true,
    defaultVolume: serializedElement.defaultVolume !== undefined ? serializedElement.defaultVolume as number : 0.8,
    minVolume: serializedElement.minVolume !== undefined ? serializedElement.minVolume as number : 0,
    muteControl: serializedElement.muteControl !== undefined ? serializedElement.muteControl as boolean : true,
    interactiveMuteControl:
      serializedElement.interactiveMuteControl !== undefined ?
        serializedElement.interactiveMuteControl as boolean : true,
    hintLabel: serializedElement.hintLabel as string || '',
    hintLabelDelay: serializedElement.hintLabelDelay !== undefined ? serializedElement.hintLabelDelay as number : 0,
    uninterruptible:
      serializedElement.uninterruptible !== undefined ? serializedElement.uninterruptible as boolean : false,
    hideOtherPages:
      serializedElement.hideOtherPages !== undefined ? serializedElement.hideOtherPages as boolean : false,
    activeAfterID: serializedElement.activeAfterID as string || '',
    minRuns: serializedElement.minRuns !== undefined ? serializedElement.minRuns as number : 1,
    maxRuns: serializedElement.maxRuns !== undefined ? serializedElement.maxRuns as number : null,
    showRestRuns: serializedElement.showRestRuns !== undefined ? serializedElement.showRestRuns as boolean : false,
    showRestTime: serializedElement.showRestTime !== undefined ? serializedElement.showRestTime as boolean : true,
    playbackTime: serializedElement.playbackTime !== undefined ? serializedElement.playbackTime as number : 0
  };
}