import mongooseModel from "mongoose";
const mongoose = require("mongoose");

const Order = mongoose.Schema(
  {
    gifts: [
      {
        product: {
          type: mongoose.Schema.Types.ObjectId,
          ref: "Product",
          required: true,
        },
        selectedVariations: {
          color: {
            type: String,
            required: false,
          },
          size: {
            type: String,
            required: false,
          },
        },
        price: {
          type: Number,
          required: false,
        },
        vendor: {
          type: mongoose.Schema.Types.ObjectId,
          ref: "User",
          required: false,
        },
      },
    ],
    vendor: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true,
    },
    amount: {
      type: Number,
      default: 0,
      required: true,
    },
    subtotal: {
      type: Number,
      default: 0,
      required: false,
    },
    taxAmount: {
      type: Number,
      default: 0,
      required: false,
    },
    shippingAmount: {
      type: Number,
      default: 0,
      required: false,
    },
    totalAmount: {
      type: Number,
      default: 0,
      required: true,
    },
    status: {
      type: String,
      default: "paid",
      required: true,
    },
    user: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "User",
      required: true,
    },
    event: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Event",
      required: true,
    },
    amountDispatched: {
      type: Boolean,
      default: false,
    },
    shippingService: {
      type: String,
      default: "selfDelivery",
      required: false,
    },
    trackingID: {
      type: String,
      default: "",
      required: false,
    },
    trackingURL: {
      type: String,
      default: "",
      required: false,
    },
    deliveredAt: {
      type: Date,
      required: false,
    },
    paymentRequestedAt: {
      type: Date,
      required: false,
    },

    //address feilds

    address: {
      type: String,
      required: true,
    },
    state: {
      type: String,
      required: true,
    },
    city: {
      type: String,
      required: true,
    },
    zipcode: {
      type: String,
      required: true,
    },
    additionalAddressInfo: {
      type: String,
      required: false,
    },
    recipientName: {
      type: String,
      required: false,
    },
    billingAddress: {
      type: String,
      required: false,
    },
    billingState: {
      type: String,
      required: false,
    },
    billingCity: {
      type: String,
      required: false,
    },
    billingZipcode: {
      type: String,
      required: false,
    },
    billingAdditionalAddressInfo: {
      type: String,
      required: false,
    },
    selectedCarrier: {
      type: String,
      required: false,
    },
    // Copied from the event at checkout so the order keeps its occasion even
    // if the event is later edited or deleted.
    occasion: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Occasion",
      required: false,
      default: null,
    },
  },
  { timestamps: true },
);

Order.pre("find", function (this: mongooseModel.Model<any>) {
  this.populate("event", []);
  this.populate("gifts.product", []);
  this.populate("user", []);
  this.populate("vendor", []);
  this.populate("occasion", []);
});
Order.pre("findOne", function (this: mongooseModel.Model<any>) {
  this.populate("event", []);
  this.populate("gifts.product", []);
  this.populate("user", []);
  this.populate("vendor", []);
  this.populate("occasion", []);
});

Order.pre("findById", function (this: mongooseModel.Model<any>) {
  this.populate("event", []);
  this.populate("gifts.product", []);
  this.populate("user", []);
  this.populate("vendor", []);
  this.populate("occasion", []);
});

export default mongoose.model("Order", Order);
