import { PipelineStage, PopulateOptions } from 'mongoose';

/** 
 * Converts a semicolon-separated populate string into an array of PopulateOptions. 
 * Example input: "locality:name;city:name;propertyType:name" 
 */ 
export const parsePopulateString = (populateStr?: string): PopulateOptions[] => { 
  if (!populateStr) return []; 

  return populateStr.split(';').map((item) => { 
    const [path, select] = item.split(':'); 
    const populateOption: PopulateOptions = { path: path.trim() }; 

    if (select)  
      populateOption.select = select.trim(); 
     

    return populateOption; 
  }); 
};

export const groupByQuery = ({
  fieldsArray,
  sortBy,
  lookup,
  unwindField,
}: {
  fieldsArray: { key: string; value: string }[];
  sortBy: string;
  lookup?: PipelineStage.Lookup['$lookup'];
  unwindField?: string;
}): PipelineStage[] => {
  const [sortbyField, sortOrder] = sortBy.split(':');

  // Start with empty pipeline
  const stages: PipelineStage[] = [];

  // Conditionally push $lookup stage
  if (lookup)
    stages.push({
      $lookup: lookup,
    });
  if (unwindField)
    stages.push({
      $unwind: `$${unwindField}`,
    });

  // Push group stage
  stages.push({
    $group: {
      _id: fieldsArray.map((field) => ({
        [field.key]: `$${field.value}`,
      })),
      count: { $sum: 1 },
    },
  });

  // Push sort stage
  stages.push({
    $sort: {
      [sortbyField]: sortOrder === 'desc' ? -1 : 1,
    },
  });

  return stages;
};