import {
  Sequelize,
  DataTypes,
  Model,
  InferAttributes,
  InferCreationAttributes,
  CreationOptional,
} from "sequelize";
import { parseJsonValue } from "@/lib/utils/parse-json-column";

export class ParticipantDomesticState extends Model<
  InferAttributes<ParticipantDomesticState>,
  InferCreationAttributes<ParticipantDomesticState>
> {
  declare id: CreationOptional<string>;
  declare participantProfileId: string;
  declare feedVersion: CreationOptional<number>;
  declare queueRevision: CreationOptional<number>;
  declare completedCount: CreationOptional<number>;
  declare skippedCount: CreationOptional<number>;
  declare suppressedQuestionIds: CreationOptional<string[] | null>;
  declare state: CreationOptional<"active" | "paused">;
  declare lastServedAt: CreationOptional<Date | null>;
  declare lastAnsweredAt: CreationOptional<Date | null>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initParticipantDomesticStateModel(sequelize: Sequelize) {
  ParticipantDomesticState.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      participantProfileId: {
        type: DataTypes.UUID,
        allowNull: false,
        unique: true,
      },
      feedVersion: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1 },
      queueRevision: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
      },
      completedCount: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
      },
      skippedCount: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
      },
      suppressedQuestionIds: {
        type: DataTypes.JSON,
        allowNull: true,
        get() {
          const v = parseJsonValue(this.getDataValue("suppressedQuestionIds"));
          return Array.isArray(v) ? (v as string[]) : [];
        },
      },
      state: {
        type: DataTypes.ENUM("active", "paused"),
        allowNull: false,
        defaultValue: "active",
      },
      lastServedAt: { type: DataTypes.DATE, allowNull: true },
      lastAnsweredAt: { type: DataTypes.DATE, allowNull: true },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    {
      sequelize,
      modelName: "ParticipantDomesticState",
      tableName: "ParticipantDomesticStates",
    }
  );
  return ParticipantDomesticState;
}
