/* Disabled due to sequelize's DataTypes */
/* eslint-disable new-cap */

import type { Snowflake } from "discord.js";
import { Sequelize, Model, DataTypes, Optional } from "sequelize";
import { v4 as uuidv4 } from "uuid";
import log from "../../utils/logger";

export interface StempelAttributes {
    id: string;
    invitator: Snowflake;
    invitedMember: Snowflake;
}

export interface StempelCreationAttributes extends Optional<StempelAttributes, "id"> { }

export default class Stempel extends Model<StempelAttributes, StempelCreationAttributes> implements StempelAttributes {
    declare id: string;
    declare invitator: Snowflake;
    declare invitedMember: Snowflake;

    /**
     * @returns true/false depending if the invitedMember is already in the database
     */
    static async insertStempel(invitator: Snowflake, invitedMember: Snowflake): Promise<boolean> {
        log.debug(`Inserting Stempel into Database with ${invitator} invitator and ${invitedMember} as invited member`);
        try {
            await Stempel.create({
                invitator,
                invitedMember
            });
            return true;
        }
        catch {
            log.debug("Stempel does already exist");
            return false;
        }
    }

    /**
     * @param {Snowflake} invitator Snowflake ID of the inviter.
     */
    static getStempelByInvitator(invitator: Snowflake) {
        return Stempel.findAll({
            where: {
                invitator
            }
        });
    }

    static initialize(sequelize: Sequelize) {
        this.init({
            id: {
                type: DataTypes.STRING(36),
                defaultValue: () => uuidv4(),
                primaryKey: true
            },
            invitator: {
                type: DataTypes.STRING(32),
                allowNull: false
            },
            invitedMember: {
                type: DataTypes.STRING(32),
                allowNull: false,
                unique: true
            }
        },
        {
            sequelize,
            modelName: "Stempel"
        });
    }
}