import { getObjectId } from '@/shared/utils/commonHelper';
import {
  IInvoiceSettingsDoc,
  NewCreatedInvoiceSettings,
} from './invoiceSettings.interface';
import { InvoiceSettings } from './invoiceSettings.model';
import { ApiError } from '@/shared/utils/errors';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { defaultStatus } from '@/shared/utils/responseCode/httpStatusAlias';
import { PaginateOptions } from '@/shared/utils/plugins/paginate/paginate';
import { FilterQuery } from 'mongoose';

const { InvoiceSettingsResponseCodes } = responseCodes;

export const getInvoiceSettings = async (
  filter: FilterQuery<IInvoiceSettingsDoc>,
  options: PaginateOptions,
) => InvoiceSettings.paginate(filter, options);

export const upsertInvoiceSettings = async (
  payload: NewCreatedInvoiceSettings,
): Promise<IInvoiceSettingsDoc> => {
  const companyObjectId = getObjectId(payload.company);

  const updated = await InvoiceSettings.findOneAndUpdate(
    { company: companyObjectId },
    {
      $set: {
        ...payload,
        company: companyObjectId,
        updatedBy: payload.updatedBy,
      },
    },
    {
      new: true,
      upsert: true,
      setDefaultsOnInsert: true,
    },
  );

  if (!updated) 
    throw new ApiError(
      defaultStatus.INTERNAL_SERVER_ERROR,
      'Failed to upsert invoice settings',
      true,
      '',
      InvoiceSettingsResponseCodes.INVOICE_SETTINGS_ERROR,
    );
  

  return updated;
};
