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

export interface CampaignLogAttributes extends Optional<CampaignLogInterface, 'id'> { }

export class CampaignLog extends Model<CampaignLogInterface, CampaignLogAttributes> implements CampaignLogInterface {
    public id!: number;
    public userId!: number;
    public accountId!: number | null;
    public campaignId!: number;
    public replacements!: JSON | null;
    public template!: string | null;
    public sendTo!: string;
    public deviceType!: string | null;
    public replacement!: JSON;
    public status!: number;
    public messageId!: number;
    public openCount!: number;
    public clickCount!: number;
    public complaintStatus!: number;
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

    static initModel(sequelize: Sequelize): typeof CampaignLog {
        CampaignLog.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: "account identifier" },
                campaignId: { type: DataTypes.BIGINT, allowNull: true, defaultValue: null, comment: "campaign identifier" },
                sendTo: { type: DataTypes.STRING, allowNull: false, comment: "send To" },
                deviceType: { type: DataTypes.STRING, allowNull: true, defaultValue: null, comment: "device type" },
                replacements: { type: DataTypes.JSON, allowNull: true, defaultValue: null, comment: "replacements" },
                template: { type: DataTypes.TEXT, allowNull: true, defaultValue: null, comment: "template" },
                status: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 0, comment: "delivery status" },
                messageId: { type: DataTypes.STRING, allowNull: true, defaultValue: null, comment: "log identifier" },
                openCount: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 0, comment: "open Count" },
                clickCount: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 0, comment: "click count" },
                complaintStatus: { type: DataTypes.BOOLEAN, defaultValue: false, comment: "complaint flag" },
            },
            {
                paranoid: true,
                underscored: true,
                sequelize,
                tableName: 'campaigns_logs',
                timestamps: true,
                indexes: [
                    { name: 'campaign-logs', fields: ['campaign_id'] },
                ],
            }
        );
        return CampaignLog;
    }

    public static associate(models: any) {
        CampaignLog.belongsTo(models.User, { foreignKey: 'userId', as: 'campaignUser' });
        CampaignLog.belongsTo(models.Campaign, { foreignKey: 'campaignId', as: 'campaign' });
    }
}
