import { Document, Event, User } from "@server/models";

export default async function documentCreator({
  title = "",
  text = "",
  publish,
  collectionId,
  parentDocumentId,
  templateDocument,
  createdAt,
  // allows override for import
  updatedAt,
  template,
  index,
  user,
  editorVersion,
  source,
  ip,
}: {
  title: string;
  text: string;
  publish?: boolean;
  collectionId: string;
  parentDocumentId?: string;
  templateDocument?: Document;
  template?: boolean;
  createdAt?: Date;
  updatedAt?: Date;
  index?: number;
  // @ts-expect-error ts-migrate(2749) FIXME: 'User' refers to a value, but is being used as a t... Remove this comment to see the full error message
  user: User;
  editorVersion?: string;
  source?: "import";
  ip: string;
  // @ts-expect-error ts-migrate(1064) FIXME: The return type of an async function or method mus... Remove this comment to see the full error message
}): Document {
  // @ts-expect-error ts-migrate(2339) FIXME: Property 'id' does not exist on type 'Document'.
  const templateId = templateDocument ? templateDocument.id : undefined;
  const document = await Document.create({
    parentDocumentId,
    editorVersion,
    collectionId,
    teamId: user.teamId,
    userId: user.id,
    createdAt,
    updatedAt,
    lastModifiedById: user.id,
    createdById: user.id,
    template,
    templateId,
    title: templateDocument ? templateDocument.title : title,
    // @ts-expect-error ts-migrate(2339) FIXME: Property 'text' does not exist on type 'Document'.
    text: templateDocument ? templateDocument.text : text,
  });
  await Event.create({
    name: "documents.create",
    documentId: document.id,
    collectionId: document.collectionId,
    teamId: document.teamId,
    actorId: user.id,
    data: {
      source,
      title: document.title,
      templateId,
    },
    ip,
  });

  if (publish) {
    await document.publish(user.id);
    await Event.create({
      name: "documents.publish",
      documentId: document.id,
      collectionId: document.collectionId,
      teamId: document.teamId,
      actorId: user.id,
      data: {
        source,
        title: document.title,
      },
      ip,
    });
  }

  // reload to get all of the data needed to present (user, collection etc)
  // we need to specify publishedAt to bypass default scope that only returns
  // published documents
  return Document.findOne({
    where: {
      id: document.id,
      publishedAt: document.publishedAt,
    },
  });
}
