import type { PrismaClient, Prisma } from '@prisma/client';
import { buildSequenceKey, formatSequenceNumber, getSequenceDefinition, type DocumentSequenceType } from './document-sequences';

type SequenceClient = PrismaClient | Prisma.TransactionClient;

export const nextDatabaseDocumentSequence = async (
  client: SequenceClient,
  type: DocumentSequenceType,
  issuedAt = new Date(),
) => {
  const definition = getSequenceDefinition(type);
  const key = buildSequenceKey(type, issuedAt);
  const existingSequence = await client.documentSequence.findUnique({
    where: { key },
  });

  if (!existingSequence) {
    return client.documentSequence.create({
      data: {
        key,
        series: definition.series,
        year: issuedAt.getFullYear(),
        currentNumber: 1,
      },
    });
  }

  return client.documentSequence.update({
    where: { key },
    data: {
      series: definition.series,
      currentNumber: {
        increment: 1,
      },
    },
  });
};

export const buildDocumentNumberFromSequence = (sequence: { series: string; currentNumber: number }) =>
  formatSequenceNumber(sequence.series, sequence.currentNumber);
