import {
  Sequelize,
  DataTypes,
  Model,
  InferAttributes,
  InferCreationAttributes,
  CreationOptional,
} from "sequelize";
import type { EmailCampaignDeliveryStatus } from "@/types";

export class EmailCampaignDelivery extends Model<
  InferAttributes<EmailCampaignDelivery>,
  InferCreationAttributes<EmailCampaignDelivery>
> {
  declare id: CreationOptional<string>;
  declare collectorId: string;
  declare voterRollId: string;
  declare status: EmailCampaignDeliveryStatus;
  declare sentAt: Date;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initEmailCampaignDeliveryModel(sequelize: Sequelize) {
  EmailCampaignDelivery.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      collectorId: { type: DataTypes.UUID, allowNull: false },
      voterRollId: { type: DataTypes.UUID, allowNull: false },
      status: {
        type: DataTypes.ENUM("sent", "delivered", "bounced", "opened", "voted"),
        allowNull: false,
        defaultValue: "sent",
      },
      sentAt: { type: DataTypes.DATE, allowNull: false },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    {
      sequelize,
      modelName: "EmailCampaignDelivery",
      tableName: "EmailCampaignDeliveries",
    }
  );
  return EmailCampaignDelivery;
}
