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

export class ConsentPolicy extends Model<
  InferAttributes<ConsentPolicy>,
  InferCreationAttributes<ConsentPolicy>
> {
  declare id: CreationOptional<string>;
  declare key: string;
  declare version: number;
  declare title: string;
  declare purpose: string;
  declare controller: string;
  declare dataCategories: CreationOptional<string[] | null>;
  declare retentionDays: CreationOptional<number | null>;
  declare policyText: string;
  declare contentHash: string;
  declare isRequired: CreationOptional<boolean>;
  declare effectiveFrom: Date;
  declare retiredAt: CreationOptional<Date | null>;
  declare createdAt: CreationOptional<Date>;
  declare updatedAt: CreationOptional<Date>;
}

export function initConsentPolicyModel(sequelize: Sequelize) {
  ConsentPolicy.init(
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
      },
      key: { type: DataTypes.STRING(64), allowNull: false },
      version: { type: DataTypes.INTEGER, allowNull: false },
      title: { type: DataTypes.STRING(255), allowNull: false },
      purpose: { type: DataTypes.TEXT, allowNull: false },
      controller: { type: DataTypes.STRING(255), allowNull: false },
      dataCategories: {
        type: DataTypes.JSON,
        allowNull: true,
        get() {
          const v = parseJsonValue(this.getDataValue("dataCategories"));
          return Array.isArray(v) ? (v as string[]) : null;
        },
      },
      retentionDays: { type: DataTypes.INTEGER, allowNull: true },
      policyText: { type: DataTypes.TEXT, allowNull: false },
      contentHash: { type: DataTypes.STRING(64), allowNull: false },
      isRequired: {
        type: DataTypes.BOOLEAN,
        allowNull: false,
        defaultValue: false,
      },
      effectiveFrom: { type: DataTypes.DATE, allowNull: false },
      retiredAt: { type: DataTypes.DATE, allowNull: true },
      createdAt: DataTypes.DATE,
      updatedAt: DataTypes.DATE,
    },
    { sequelize, modelName: "ConsentPolicy", tableName: "ConsentPolicies" }
  );
  return ConsentPolicy;
}
