/**
 * WebhookEvent Model
 * Provider event de-duplication with retry-safe failure tracking.
 */

import mongoose, { Schema, Document, Model } from "mongoose";

export interface IWebhookEvent extends Document {
  provider: "stripe";
  eventId: string;
  type: string;
  status: "processing" | "processed" | "failed";
  eventCreatedAt?: Date | null;
  objectId?: string | null;
  attemptCount: number;
  leaseUntil?: Date | null;
  processingStartedAt?: Date | null;
  processedAt?: Date | null;
  lastError?: string | null;
  createdAt: Date;
  updatedAt: Date;
}

const WebhookEventSchema = new Schema<IWebhookEvent>(
  {
    provider: {
      type: String,
      enum: ["stripe"],
      required: true,
    },
    eventId: {
      type: String,
      required: true,
    },
    type: {
      type: String,
      required: true,
    },
    status: {
      type: String,
      enum: ["processing", "processed", "failed"],
      default: "processing",
      required: true,
    },
    eventCreatedAt: {
      type: Date,
      default: null,
    },
    objectId: {
      type: String,
      default: null,
    },
    attemptCount: {
      type: Number,
      default: 0,
      min: 0,
    },
    leaseUntil: {
      type: Date,
      default: null,
    },
    processingStartedAt: {
      type: Date,
      default: null,
    },
    processedAt: {
      type: Date,
      default: null,
    },
    lastError: {
      type: String,
      default: null,
      maxlength: 2000,
    },
  },
  { timestamps: true },
);

WebhookEventSchema.index({ provider: 1, eventId: 1 }, { unique: true });
WebhookEventSchema.index({ provider: 1, processedAt: 1 });
WebhookEventSchema.index({ provider: 1, status: 1, leaseUntil: 1 });

export const WebhookEvent: Model<IWebhookEvent> =
  mongoose.models.WebhookEvent ||
  mongoose.model<IWebhookEvent>("WebhookEvent", WebhookEventSchema);
