import mongoose from "mongoose";
import { PDStock } from "./PdStockModel.js";
import { Product } from "../Products/ProductModel.js";
import { RDStock } from "./RdStockModel.js";

export const getProductsAndStockByPD = async (req, res) => {
  try {
    const { userId } = req.params;

    // Pagination parameters
    const PAGE_SIZE = parseInt(req.query.show) || 10;
    const page = parseInt(req.query.page) || 1;
    const skip = (page - 1) * PAGE_SIZE;

    // Filtering criteria
    const filter = {};
    if (req.query.name) {
      filter.name = {
        $regex: new RegExp(req.query.name, "i"),
      };
    }
    if (req.query.category) {
      filter.category = mongoose.Types.ObjectId(req.query.category);
    }
    if (req.query.brand) {
      filter.brand = mongoose.Types.ObjectId(req.query.brand);
    }

    // Fetch user's PDStock data and products concurrently
    const [userStock, products] = await Promise.all([
      PDStock.findOne({ userId: mongoose.Types.ObjectId(userId) }),
      Product.aggregate([
        { $match: filter },
        {
          $lookup: {
            from: "categorymodels",
            localField: "category",
            foreignField: "_id",
            as: "categoryDetails",
          },
        },
        {
          $lookup: {
            from: "brandmodels",
            localField: "brand",
            foreignField: "_id",
            as: "brandDetails",
          },
        },
        {
          $project: {
            category: { $arrayElemAt: ["$categoryDetails.categoryName", 0] },
            brand: { $arrayElemAt: ["$brandDetails.brandName", 0] },
            GST: 1,
            HSN_Code: 1,
            SKU: 1,
            addedBy: 1,
            createdAt: 1,
            description: 1,
            image: 1,
            name: 1,
            price: 1,
            product_Status: 1,
            updatedAt: 1,
          },
        },
        { $skip: skip },
        { $limit: PAGE_SIZE },
      ]),
    ]);

    // Create a stock map for easy lookup
    const stockMap = {};
    if (userStock && userStock.products) {
      userStock.products.forEach((product) => {
        stockMap[product.productid.toString()] = product.Stock;
      });
    }

    // Combine products with their respective stock
    const productsWithStock = products.map((product) => ({
      ...product,
      stock: stockMap[product._id.toString()] || 0,
    }));

    // Get total count for pagination purposes
    const total = await Product.countDocuments(filter);

    return res.status(200).json({
      success: true,
      totalProducts: total,
      totalPages: Math.ceil(total / PAGE_SIZE),
      currentPage: page,
      products: productsWithStock,
    });
  } catch (error) {
    console.error("Error fetching products with stock:", error);
    return res.status(500).json({
      success: false,
      message: "Error fetching products and stock",
    });
  }
};

export const getProductsAndStockByRD = async (req, res) => {
  try {
    const userId = req.params.userId || req.user._id;

    // Pagination parameters
    const PAGE_SIZE = parseInt(req.query.show) || 10;
    const page = parseInt(req.query.page) || 1;
    const skip = (page - 1) * PAGE_SIZE;

    // Filtering criteria
    const filter = {};
    if (req.query.name) {
      filter.name = {
        $regex: new RegExp(req.query.name, "i"),
      };
    }
    if (req.query.category) {
      filter.category = mongoose.Types.ObjectId(req.query.category);
    }
    if (req.query.brand) {
      filter.brand = mongoose.Types.ObjectId(req.query.brand);
    }

    // Fetch user's RDStock data and products concurrently
    const [userStock, products] = await Promise.all([
      RDStock.findOne({ userId: mongoose.Types.ObjectId(userId) }),
      Product.aggregate([
        { $match: filter },
        {
          $lookup: {
            from: "categorymodels",
            localField: "category",
            foreignField: "_id",
            as: "categoryDetails",
          },
        },
        {
          $lookup: {
            from: "brandmodels",
            localField: "brand",
            foreignField: "_id",
            as: "brandDetails",
          },
        },
        {
          $project: {
            category: { $arrayElemAt: ["$categoryDetails.categoryName", 0] },
            brand: { $arrayElemAt: ["$brandDetails.brandName", 0] },
            GST: 1,
            HSN_Code: 1,
            SKU: 1,
            addedBy: 1,
            createdAt: 1,
            description: 1,
            image: 1,
            name: 1,
            price: 1,
            product_Status: 1,
            updatedAt: 1,
          },
        },
        { $skip: skip },
        { $limit: PAGE_SIZE },
      ]),
    ]);

    // Create a stock map for easy lookup
    const stockMap = {};
    if (userStock && userStock.products) {
      userStock.products.forEach((product) => {
        stockMap[product.productid.toString()] = product.Stock;
      });
    }

    // Combine products with their respective stock
    const productsWithStock = products.map((product) => ({
      ...product,
      stock: stockMap[product._id.toString()] || 0,
    }));

    // Get total count for pagination purposes
    const total = await Product.countDocuments(filter);

    return res.status(200).json({
      success: true,
      totalProducts: total,
      totalPages: Math.ceil(total / PAGE_SIZE),
      currentPage: page,
      products: productsWithStock,
    });
  } catch (error) {
    console.error("Error fetching products with stock:", error);
    return res.status(500).json({
      success: false,
      message: "Error fetching products and stock",
    });
  }
};
