import { DataTypes, sequelize } from "../sequelize";

const Share = sequelize.define(
  "share",
  {
    id: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      primaryKey: true,
    },
    published: DataTypes.BOOLEAN,
    includeChildDocuments: DataTypes.BOOLEAN,
    revokedAt: DataTypes.DATE,
    revokedById: DataTypes.UUID,
    lastAccessedAt: DataTypes.DATE,
  },
  {
    getterMethods: {
      isRevoked() {
        return !!this.revokedAt;
      },
    },
  }
);

// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'models' implicitly has an 'any' type.
Share.associate = (models) => {
  Share.belongsTo(models.User, {
    as: "user",
    foreignKey: "userId",
  });
  Share.belongsTo(models.Team, {
    as: "team",
    foreignKey: "teamId",
  });
  Share.belongsTo(models.Document.scope("withUnpublished"), {
    as: "document",
    foreignKey: "documentId",
  });
  Share.addScope("defaultScope", {
    include: [
      {
        association: "user",
        paranoid: false,
      },
      {
        association: "document",
      },
      {
        association: "team",
      },
    ],
  });
  // @ts-expect-error ts-migrate(7006) FIXME: Parameter 'userId' implicitly has an 'any' type.
  Share.addScope("withCollection", (userId) => {
    return {
      include: [
        {
          model: models.Document,
          paranoid: true,
          as: "document",
          include: [
            {
              model: models.Collection.scope({
                method: ["withMembership", userId],
              }),
              as: "collection",
            },
          ],
        },
        {
          association: "user",
          paranoid: false,
        },
        {
          association: "team",
        },
      ],
    };
  });
};

// @ts-expect-error ts-migrate(7006) FIXME: Parameter 'userId' implicitly has an 'any' type.
Share.prototype.revoke = function (userId) {
  this.revokedAt = new Date();
  this.revokedById = userId;
  return this.save();
};

export default Share;
