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

export class ElectionPosition extends Model<
  InferAttributes<ElectionPosition>,
  InferCreationAttributes<ElectionPosition>
> {
  declare id: CreationOptional<string>;
  declare electionId: string;
  declare title: string;
  declare positionType: ElectionPositionType;
  declare seatsAvailable: CreationOptional<number>;
  declare position: CreationOptional<number>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initElectionPositionModel(sequelize: Sequelize) {
  ElectionPosition.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      electionId: { type: DataTypes.UUID, allowNull: false },
      title: { type: DataTypes.STRING(500), allowNull: false },
      positionType: {
        type: DataTypes.ENUM("single_seat", "multi_seat", "ballot_measure"),
        allowNull: false,
        defaultValue: "single_seat",
      },
      seatsAvailable: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 1,
      },
      position: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0,
      },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    { sequelize, modelName: "ElectionPosition", tableName: "ElectionPositions" }
  );
  return ElectionPosition;
}
