/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { TDShape, SessionType, TldrawPatch, TldrawCommand } from '~types'
import { BaseSession } from '../BaseSession'
import type { TldrawApp } from '../../internal'

export class EditSession extends BaseSession {
  type = SessionType.Edit
  performanceMode = undefined

  initialShape: TDShape
  initialSelectedIds: string[]
  currentPageId: string
  isCreating: boolean

  constructor(app: TldrawApp, id: string, isCreating: boolean) {
    super(app)
    this.initialShape = app.getShape(id, app.currentPageId)
    this.currentPageId = app.currentPageId
    this.isCreating = isCreating
    this.initialSelectedIds = [...app.selectedIds]
  }

  start = (): TldrawPatch | undefined => void null

  update = (): TldrawPatch | undefined => void null

  cancel = (): TldrawPatch | undefined => {
    return {
      document: {
        pages: {
          [this.currentPageId]: {
            shapes: {
              [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,
            },
          },
        },
        pageStates: {
          [this.currentPageId]: {
            selectedIds: this.isCreating ? [] : this.initialSelectedIds,
            editingId: undefined,
          },
        },
      },
    }
  }

  complete = (): TldrawPatch | TldrawCommand | undefined => {
    const shape = this.app.getShape(this.initialShape.id)

    return {
      id: 'edit',
      before: {
        document: {
          pages: {
            [this.currentPageId]: {
              shapes: {
                [this.initialShape.id]: this.isCreating ? undefined : this.initialShape,
              },
            },
          },
          pageStates: {
            [this.currentPageId]: {
              selectedIds: this.isCreating ? [] : this.initialSelectedIds,
              editingId: undefined,
            },
          },
        },
      },
      after: {
        document: {
          pages: {
            [this.currentPageId]: {
              shapes: {
                [this.initialShape.id]: shape,
              },
            },
          },
          pageStates: {
            [this.currentPageId]: {
              selectedIds: [shape.id],
              editingId: undefined,
            },
          },
        },
      },
    }
  }
}
