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

export interface CampaignUserAttributes extends Optional<CampaignUserInterface, 'id'> {}

export class CampaignUser extends Model<CampaignUserInterface, CampaignUserAttributes> implements CampaignUserInterface {
    public id!: number;
    public userId!: number;
    public campaignId!: number;
    public acknowledgementId!: string | null;
    public status!: number;
    public readonly createdAt!: Date;
    public readonly updatedAt!: Date;

    static initModel(sequelize: Sequelize): typeof CampaignUser {
        CampaignUser.init(
            {
                id: { type: DataTypes.BIGINT, autoIncrement: true, primaryKey: true, comment: "unique identifier" },
                userId: { type: DataTypes.BIGINT, allowNull: false, comment: "user identifier" },
                campaignId: { type: DataTypes.BIGINT, allowNull: false, comment: "campaign identifier" },
                acknowledgementId: { type: DataTypes.STRING, allowNull: true, defaultValue: null, comment: "external acknowledgement reference id" },
                status: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 1, comment: "status of user in campaign" },
            },
            {
                paranoid: true,
                underscored: true,
                sequelize,
                tableName: 'campaign_users',
                timestamps: true,
                indexes: [
                    { name: 'campaign-users-user-index', fields: ['user_id'] },
                    { name: 'campaign-users-campaign-index', fields: ['campaign_id'] },
                    { name: 'campaign-users-unique', unique: true, fields: ['user_id', 'campaign_id'] }, // prevent duplicates
                ],
            }
        );
        return CampaignUser;
    }

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

        // Many-to-many helpers
        // models.Campaign.belongsToMany(models.User, { through: CampaignUser, foreignKey: 'campaignId', otherKey: 'userId', as: 'users' });
        // models.User.belongsToMany(models.Campaign, { through: CampaignUser, foreignKey: 'userId', otherKey: 'campaignId', as: 'campaigns' });
    }
}
