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

export class ElectionTemplate extends Model<
  InferAttributes<ElectionTemplate>,
  InferCreationAttributes<ElectionTemplate>
> {
  declare id: CreationOptional<string>;
  declare workspaceId: string;
  declare name: string;
  declare snapshot: ElectionTemplateSnapshot;
  declare createdBy: string | null;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initElectionTemplateModel(sequelize: Sequelize) {
  ElectionTemplate.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      workspaceId: { type: DataTypes.UUID, allowNull: false },
      name: { type: DataTypes.STRING(255), allowNull: false },
      snapshot: {
        type: DataTypes.JSON,
        allowNull: false,
        get() {
          return parseJsonColumn<ElectionTemplateSnapshot>(
            this.getDataValue("snapshot")
          ) as ElectionTemplateSnapshot;
        },
        set(value: ElectionTemplateSnapshot | string) {
          this.setDataValue(
            "snapshot",
            typeof value === "string"
              ? (parseJsonColumn<ElectionTemplateSnapshot>(
                  value
                ) as ElectionTemplateSnapshot)
              : value
          );
        },
      },
      createdBy: { type: DataTypes.UUID, allowNull: true },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    {
      sequelize,
      modelName: "ElectionTemplate",
      tableName: "ElectionTemplates",
    }
  );
  return ElectionTemplate;
}
