import mongoose, { Schema, model } from 'mongoose';
import mongooseSequence from 'mongoose-sequence';
import { toJSON, paginate } from '@/shared/utils/plugins';
import { IInvoiceDoc, IInvoiceModel } from './invoice.interface';
import { InvoiceStatus, ValidUnit } from '@/shared/constants/enum.constant';

const AutoIncrement = mongooseSequence(mongoose.connection);

const invoiceSchema = new Schema<IInvoiceDoc>(
  {
    invoiceNumber: {
      type: Number,
      unique: true,
    },
    company: {
      type: Schema.Types.ObjectId,
      ref: 'Company',
    },
    issuedDate: {
      type: Date,
      required: true,
    },
    dueDate: {
      type: Date,
      required: true,
    },
    maxUserCount: { type: Number },
    planValidity: {
      validfor: { type: Number },
      validUnit: { type: String, enum: Object.values(ValidUnit) },
    },
    price: {
      type: Number,
      default: 0,
    },
    tax: {
      type: Number,
      default: 0,
    },
    discount: {
      type: Number,
      default: 0,
    },
    finalPrice: {
      type: Number,
      default: 0,
    },
    status: {
      type: String,
      enum: Object.values(InvoiceStatus),
      default: InvoiceStatus.UNPAID,
    },
    note: {
      type: String,
      default: '',
    },
    createdBy: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
    updatedBy: {
      type: Schema.Types.ObjectId,
      ref: 'User',
    },
  },
  {
    timestamps: true,
  },
);

// ✅ Auto-increment plugin
invoiceSchema.plugin(AutoIncrement, {
  // eslint-disable-next-line camelcase
  inc_field: 'invoiceNumber', start_seq: 1000,
});

invoiceSchema.plugin(toJSON);
invoiceSchema.plugin(paginate);

export const Invoice = model<IInvoiceDoc, IInvoiceModel>('Invoice', invoiceSchema);
