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

export interface EmailTemplateAttributes extends Optional<EmailTemplateInterface, 'id'> { }

export class EmailTemplate extends Model<EmailTemplateInterface, EmailTemplateAttributes> implements EmailTemplateInterface {
    public id!: number;
    public code!: string;
    public isRevision!: boolean;
    public revisionId!: number;
    public userId!: number;
    public accountId!: number;
    public lastUpdatedBy!: number;
    public replacements!: string;
    public status!: number;
    public sortOrder!: number;
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

    static initModel(sequelize: Sequelize): typeof EmailTemplate {
        EmailTemplate.init(
            {
                id: { type: DataTypes.BIGINT, autoIncrement: true, primaryKey: true, comment: "unique identifier" },
                userId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "user identifier" },
                accountId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "user Account identifier" },
                lastUpdatedBy: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "user identifier" },
                code: { type: DataTypes.STRING, allowNull: false, unique: "unique-email-template", comment: "email template code" },
                replacements: { type: DataTypes.STRING, allowNull: false, unique: "unique-email-template", comment: "email template replacements" },
                isRevision: { type: DataTypes.BOOLEAN, allowNull: true, defaultValue: false, comment: "is revision?" },
                revisionId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "revision ref identifier" },
                sortOrder: { type: DataTypes.INTEGER, defaultValue: 0, comment: "email template sort order" },
                status: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 1, comment: "email template's status" }
            },
            {
                paranoid: true,
                underscored: true,
                sequelize,
                tableName: 'email_templates',
                timestamps: true,
                indexes: [
                    { name: 'email-template-revision-index', fields: ['is_revision'] },
                    { name: 'email-template-index', fields: ['status'] },
                    { name: 'email-template-code-index', fields: ['code'] }
                ]

            }
        );
        return EmailTemplate;
    }

    public static associate(models: any) {
        EmailTemplate.hasOne(models.EmailTemplateContent, { foreignKey: 'emailTemplateId', as: 'defaultContent' });
        EmailTemplate.hasOne(models.EmailTemplateContent, { foreignKey: 'emailTemplateId', as: 'content' });
        EmailTemplate.hasOne(models.EmailTemplateContent, { foreignKey: 'emailTemplateId', as: 'emailTemplateContent' });
        EmailTemplate.hasMany(models.EmailTemplateContent, { foreignKey: 'emailTemplateId', as: 'emailTemplateContents' });
        EmailTemplate.belongsTo(models.User, { foreignKey: 'userId', as: 'author' });
        EmailTemplate.belongsTo(models.User, { foreignKey: 'lastUpdatedBy', as: 'updatedBy' });
        EmailTemplate.belongsToMany(models.Attachment, { through: "email_template_attachments", foreignKey: "emailTemplateId", as: "emailTemplateAttachments", otherKey: "attachmentId" });
    }
}
