import { v4 as uuidv4 } from "uuid";
import { User, Document, Collection, Team } from "@server/models";
import { sequelize } from "../sequelize";

const sql = sequelize.getQueryInterface();
const tables = Object.keys(sequelize.models).map((model) => {
  const n = sequelize.models[model].getTableName();
  return sql.queryGenerator.quoteTable(typeof n === "string" ? n : n.tableName);
});
const flushQuery = `TRUNCATE ${tables.join(", ")}`;

export function flushdb() {
  return sequelize.query(flushQuery);
}

export const seed = async () => {
  const team = await Team.create(
    {
      name: "Team",
      collaborativeEditing: false,
      authenticationProviders: [
        {
          name: "slack",
          providerId: uuidv4(),
        },
      ],
    },
    {
      include: "authenticationProviders",
    }
  );
  const authenticationProvider = team.authenticationProviders[0];
  const admin = await User.create(
    {
      email: "admin@example.com",
      username: "admin",
      name: "Admin User",
      teamId: team.id,
      isAdmin: true,
      createdAt: new Date("2018-01-01T00:00:00.000Z"),
      authentications: [
        {
          authenticationProviderId: authenticationProvider.id,
          providerId: uuidv4(),
        },
      ],
    },
    {
      include: "authentications",
    }
  );
  const user = await User.create(
    {
      id: "46fde1d4-0050-428f-9f0b-0bf77f4bdf61",
      email: "user1@example.com",
      name: "User 1",
      teamId: team.id,
      createdAt: new Date("2018-01-02T00:00:00.000Z"),
      authentications: [
        {
          authenticationProviderId: authenticationProvider.id,
          providerId: uuidv4(),
        },
      ],
    },
    {
      include: "authentications",
    }
  );
  const collection = await Collection.create({
    name: "Collection",
    urlId: "collection",
    teamId: team.id,
    createdById: user.id,
    permission: "read_write",
  });
  const document = await Document.create({
    parentDocumentId: null,
    collectionId: collection.id,
    teamId: team.id,
    userId: collection.createdById,
    lastModifiedById: collection.createdById,
    createdById: collection.createdById,
    title: "First ever document",
    text: "# Much test support",
  });
  await document.publish(collection.createdById);
  await collection.reload();
  return {
    user,
    admin,
    collection,
    document,
    team,
  };
};
