import mongoose, { Schema } from "mongoose";
import { DeliveryPersonType } from "../../types/DeliveryPersonType/DeliveryPersonType";

const DeliveryPersonSchema = new Schema(
    {
        ShopID:
        {
            type: String,
            required: true,
        },
        DeliveryPersonID:
        {
            type: String,
            required: true,
            unique: true
        },
        AssignedOrderID:
        {
            type: String,
        },
        AssignedItemOrderID:
        {
            type: String,
            required: false
        },
        AvailableForDelivery:
        {
            type: Boolean,
            required: true
        }
    }
);


DeliveryPersonSchema.statics.fetchByShopIDAndDeliveryPersonID = async function (shopID: String, deliveryPersonID: String): Promise<DeliveryPersonType | null> {
    let deliveryPerson: DeliveryPersonType | null = null;
    console.log("shopID received inside DeliveryPersonSchema:", shopID);
    console.log("deliveryPersonID received inside DeliveryPersonSchema:", deliveryPersonID);
    try {
        deliveryPerson = await this.findOne(
            {
                ShopID: shopID,
                DeliveryPersonID: deliveryPersonID
            }
        );
    }
    catch (e) {
        console.log("Error fetching record from DeliveryPersonSchema:", e);
    }
    console.log("returning deliveryPerson fetched from the record:", deliveryPerson);
    return deliveryPerson;
}

DeliveryPersonSchema.statics.fetchByShopID = async function (shopID: String): Promise<DeliveryPersonType[] | null> {
    let deliveryPersonList: DeliveryPersonType[] | null = null;
    console.log("shopID received inside fetchByShopID:", shopID);
    try {
        deliveryPersonList = this.find({ ShopID: shopID });
    }
    catch (e) {
        console.log("Error fetching delivery person list:", e);
    }
    console.log("deliveryPersonList:", deliveryPersonList);
    return deliveryPersonList;
}

//this function is to fetch the details of delivery person currently assigned to the given OrderID and ItemOrderID
DeliveryPersonSchema.statics.fetchByOrderIDAndItemOrderID = async function (orderID: String, itemOrderID: String): Promise<DeliveryPersonType | null> {
    let deliveryPerson: DeliveryPersonType | null = null;
    console.log("orderID received inside DeliveryPersonSchema:", orderID);
    console.log("itemOrderID received inside DeliveryPersonSchema:", itemOrderID);
    try {
        deliveryPerson = await this.findOne(
            {
                // ShopID: shopID,
                AssignedOrderID: orderID,
                AssignedItemOrderID: itemOrderID
            }
        );
    }
    catch (e) {
        console.log("Error fetching record from DeliveryPersonSchema:", e);
    }
    console.log("returning deliveryPerson fetched from the record:", deliveryPerson);
    return deliveryPerson;
}

DeliveryPersonSchema.statics.fetchByDeliveryPersonID = async function (deliveryPersonID: String): Promise<DeliveryPersonType | null> {
    let deliveryPerson: DeliveryPersonType | null = null;
    console.log("inside fetchByDeliveryPersonID method");
    console.log("deliveryPersonID received inside DeliveryPersonSchema:", deliveryPersonID);
    try {
        deliveryPerson = await this.findOne(
            {
                DeliveryPersonID: deliveryPersonID
            }
        );
    }
    catch (e) {
        console.log("Error fetching record from DeliveryPersonSchema:", e);
    }
    console.log("returning deliveryPerson fetched from the record:", deliveryPerson);
    return deliveryPerson;
}

module.exports = mongoose.model("DeliveryPersonSchema", DeliveryPersonSchema)