import { dataSource } from "../data-source";
import { invite } from "../entity/invite";
import InternalException from "../exceptions/internalException";
import { StringHelper } from "../helpers/stringHelper";
import { CreateInviteCommand, DeleteInviteCommand } from "./inviteCommand";

export default abstract class InviteCommandHandler {
  /**
   * @description create user
   * @param CreateInviteCommand
   * @returns {Promise<string>}
   */
  static async create(createInvite: CreateInviteCommand): Promise<string> {
    const token = StringHelper.random(32);

    return await dataSource
      .createQueryBuilder()
      .insert()
      .into(invite)
      .values({
        mail: createInvite.mail,
        token: token,
        username: createInvite.username,
        firstname: createInvite.firstname,
        lastname: createInvite.lastname,
        secret: createInvite.secret,
      })
      .orUpdate(["firstName", "lastName", "token", "secret"], ["mail"])
      .execute()
      .then((result) => {
        return token;
      })
      .catch((err) => {
        throw new InternalException("Failed saving invite");
      });
  }

  /**
   * @description delete invite by mail and token
   * @param DeleteRefreshCommand
   * @returns {Promise<any>}
   */
  static async deleteByTokenAndMail(deleteInvite: DeleteInviteCommand): Promise<any> {
    return await dataSource
      .createQueryBuilder()
      .delete()
      .from(invite)
      .where("invite.token = :token", { token: deleteInvite.token })
      .andWhere("invite.mail = :mail", { mail: deleteInvite.mail })
      .execute()
      .then((res) => {})
      .catch((err) => {
        throw new InternalException("failed invite removal");
      });
  }
}