import { dragObjectSymbol } from '../symbols';
import {
  IPublicModelDragObject,
  IPublicModelDragObject as InnerDragObject,
  IPublicTypeDragNodeDataObject,
  IPublicTypeNodeSchema,
} from '@felce/lowcode-types';
import { Node } from './node';

export class DragObject implements IPublicModelDragObject {
  private readonly [dragObjectSymbol]: InnerDragObject;

  constructor(dragObject: InnerDragObject) {
    this[dragObjectSymbol] = dragObject;
  }

  static create(dragObject: InnerDragObject | null): IPublicModelDragObject | null {
    if (!dragObject) {
      return null;
    }
    return new DragObject(dragObject);
  }

  get type() {
    return this[dragObjectSymbol].type;
  }

  get nodes() {
    const { nodes } = this[dragObjectSymbol];
    if (!nodes) {
      return null;
    }
    return nodes.map(Node.create);
  }

  get data(): IPublicTypeNodeSchema | IPublicTypeNodeSchema[] {
    return (this[dragObjectSymbol] as IPublicTypeDragNodeDataObject).data;
  }
}
