// eslint-disable-next-line max-classes-per-file
import { IdService } from '../id.service';

export abstract class UIElement {
  [index: string]: string | number | boolean | string[] | null | ((...args: any) => any);
  type!: 'text' | 'button' | 'text-field' | 'text-area' | 'checkbox'
  | 'dropdown' | 'radio' | 'image' | 'audio' | 'video';

  id: string = 'id_placeholder';
  zIndex: number = 0;
  width: number = 180;
  height: number = 60;
  dynamicPositioning: boolean = false;
  xPosition: number = 0;
  yPosition: number = 0;
  gridColumnStart: number = 1;
  gridColumnEnd: number = 2;
  gridRowStart: number = 1;
  gridRowEnd: number = 2;
  marginLeft: number = 0;
  marginRight: number = 0;
  marginTop: number = 0;
  marginBottom: number = 0;

  protected constructor(serializedElement: UIElement, coordinates?: { x: number; y: number }) {
    Object.assign(this, serializedElement);
    if (!serializedElement.id) {
      this.id = IdService.getInstance().getNewID(serializedElement.type);
    }
    if (coordinates && this.dynamicPositioning) {
      this.gridColumnStart = coordinates.x;
      this.gridColumnEnd = coordinates.x + 1;
      this.gridRowStart = coordinates.y;
      this.gridRowEnd = coordinates.y + 1;
    } else if (coordinates && !this.dynamicPositioning) {
      this.xPosition = coordinates.x;
      this.yPosition = coordinates.y;
    }
  }
}

export abstract class InputElement extends UIElement {
  label: string;
  value: string | number | boolean | null;
  required: boolean;
  requiredWarnMessage: string;

  protected constructor(serializedElement: UIElement, coordinates?: { x: number; y: number }) {
    super(serializedElement, coordinates);
    this.label = serializedElement.label as string || 'Dummylabel';
    this.value = serializedElement.value as string | number | boolean | null || null;
    this.required = serializedElement.required as boolean || false;
    this.requiredWarnMessage = serializedElement.requiredWarnMessage as string || 'Eingabe erforderlich';
  }
}