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

export class ParticipantQuestionQueue extends Model<
  InferAttributes<ParticipantQuestionQueue>,
  InferCreationAttributes<ParticipantQuestionQueue>
> {
  declare id: CreationOptional<string>;
  declare participantProfileId: string;
  declare domesticQuestionId: string;
  declare questionVersionId: string;
  declare position: number;
  declare reason: QueueReason;
  declare status: CreationOptional<QueueStatus>;
  /** Set while queued/served, NULL otherwise (unique index). */
  declare activeKey: CreationOptional<string | null>;
  declare sourceEdgeId: CreationOptional<string | null>;
  declare availableAt: Date;
  declare expiresAt: CreationOptional<Date | null>;
  declare servedAt: CreationOptional<Date | null>;
  declare answeredAt: CreationOptional<Date | null>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initParticipantQuestionQueueModel(sequelize: Sequelize) {
  ParticipantQuestionQueue.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      participantProfileId: { type: DataTypes.UUID, allowNull: false },
      domesticQuestionId: { type: DataTypes.UUID, allowNull: false },
      questionVersionId: { type: DataTypes.UUID, allowNull: false },
      position: { type: DataTypes.INTEGER, allowNull: false },
      reason: {
        type: DataTypes.ENUM("seed", "branch", "rotation", "profile_refresh"),
        allowNull: false,
      },
      status: {
        type: DataTypes.ENUM(
          "queued",
          "served",
          "answered",
          "skipped",
          "expired",
          "suppressed"
        ),
        allowNull: false,
        defaultValue: "queued",
      },
      activeKey: { type: DataTypes.STRING(80), allowNull: true, unique: true },
      sourceEdgeId: { type: DataTypes.UUID, allowNull: true },
      availableAt: { type: DataTypes.DATE, allowNull: false },
      expiresAt: { type: DataTypes.DATE, allowNull: true },
      servedAt: { type: DataTypes.DATE, allowNull: true },
      answeredAt: { type: DataTypes.DATE, allowNull: true },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    {
      sequelize,
      modelName: "ParticipantQuestionQueue",
      tableName: "ParticipantQuestionQueue",
    }
  );
  return ParticipantQuestionQueue;
}
