import { DataTypes, Model, Optional, Sequelize } from 'sequelize';

export interface TokenAttributes extends Optional<TokenInterface, 'id'> { }

export class Token extends Model<TokenInterface, TokenAttributes> implements TokenInterface {
    public id!: number;
    public type!: string;
    public entityValue!: string | null;
    public userId!: number | null;
    public accountId!: number | null;
    public token!: Text;
    public code!: string | null;
    public status!: number;
    public allowedAttempts!: number;
    public verificationsAttempts!: number;
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

    static initModel(sequelize: Sequelize): typeof Token {
        Token.init(
            {
                id: { type: DataTypes.BIGINT, autoIncrement: true, primaryKey: true, comment: "unique identifier" },
                type: { type: DataTypes.STRING, allowNull: false, comment: "Token type" },
                entityValue: { type: DataTypes.STRING, allowNull: true, defaultValue: null, comment: "Entity value" },
                userId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "User's identifier" },
                accountId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "User's identifier" },
                token: { type: DataTypes.TEXT, allowNull: false, comment: "Token" },
                code: { type: DataTypes.STRING, allowNull: true, defaultValue: null, comment: "Code to verify token" },
                status: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0, comment: "User's Account status" },
                allowedAttempts: { type: DataTypes.INTEGER, allowNull: false, defaultValue: +process.env.ALLOWED_VERIFICATION_ATTEMPTS!, comment: "Allowed Attempts" },
                verificationsAttempts: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 0, comment: "Attemps made" },
            },
            { paranoid: true, underscored: true, sequelize, tableName: 'tokens', timestamps: true }
        );
        return Token;
    }

    public static associate(models: any) {

    }
}
