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

export class Collector extends Model<
  InferAttributes<Collector>,
  InferCreationAttributes<Collector>
> {
  declare id: CreationOptional<string>;
  declare surveyId: string;
  declare type: CollectorType;
  declare slug: string;
  declare config: CollectorConfig | null;
  declare isActive: CreationOptional<boolean>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initCollectorModel(sequelize: Sequelize) {
  Collector.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      surveyId: { type: DataTypes.UUID, allowNull: false },
      type: {
        type: DataTypes.ENUM(
          "web_link",
          "embed",
          "qr_code",
          "email_campaign",
          "social"
        ),
        allowNull: false,
      },
      slug: { type: DataTypes.STRING(128), allowNull: false, unique: true },
      config: { type: DataTypes.JSON, allowNull: true },
      isActive: {
        type: DataTypes.BOOLEAN,
        allowNull: false,
        defaultValue: true,
      },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    { sequelize, modelName: "Collector", tableName: "Collectors" }
  );
  return Collector;
}
