import { PrismaService } from '../../prisma/prisma.service';

const MODEL_NUMBER_FIELD: Record<string, string> = {
  estimate: 'estimateNumber',
  contract: 'contractNumber',
  taxInvoice: 'invoiceNumber',
  cashReceipt: 'receiptNumber',
  settlement: 'settlementNumber',
  purchaseSaleRecord: 'recordNumber',
};

export async function generateDocumentNumber(
  prisma: PrismaService,
  modelName: string,
  prefix: string,
  userId: number,
): Promise<string> {
  const currentYear = new Date().getFullYear();
  const useYear = ['settlement', 'purchaseSaleRecord'].includes(modelName) ? false : true;
  const searchPrefix = useYear ? `${prefix}-${currentYear}-` : `${prefix}-`;

  const numberField = MODEL_NUMBER_FIELD[modelName];
  if (!numberField) {
    throw new Error(`Unknown model: ${modelName}`);
  }

  const delegate = (prisma as any)[modelName];
  const lastRecord = await delegate.findFirst({
    where: {
      userId,
      [numberField]: { startsWith: searchPrefix },
    },
    orderBy: { [numberField]: 'desc' },
    select: { [numberField]: true },
  });

  let nextSeq = 1;
  if (lastRecord && lastRecord[numberField]) {
    const parts = (lastRecord[numberField] as string).split('-');
    const lastSeq = parseInt(parts[parts.length - 1], 10);
    if (!isNaN(lastSeq)) nextSeq = lastSeq + 1;
  }

  const seqStr = String(nextSeq).padStart(3, '0');
  return useYear ? `${prefix}-${currentYear}-${seqStr}` : `${prefix}-${seqStr}`;
}
