import { UniqueID } from "@shared/contexts";
import { IDealer, IQuoteRepository, Quote, QuoteReference } from "../../domain";

const generateQuoteReferenceForDealer = async (
  dealer: IDealer,
  quoteRepository: IQuoteRepository
): Promise<QuoteReference> => {
  // Obtener la última referencia del dealer
  let lastQuoteReference = await quoteRepository.findLastReferenceByDealerId(dealer.id);
  let isUnique = false;

  // Referencia temporal
  let newQuoteReference: QuoteReference = QuoteReference.create(undefined).object;

  while (!isUnique) {
    // Generar la nueva referencia usando el Value Object
    const quoteReferenceOrError = QuoteReference.fromPrevious(
      lastQuoteReference ? lastQuoteReference : null,
      dealer
    );

    if (quoteReferenceOrError.isFailure) {
      throw new Error("Error al crear la referencia de presupuesto");
    }

    newQuoteReference = quoteReferenceOrError.object;

    // Verificar si la referencia ya existe
    const existingQuote = await quoteRepository.existsByReference(newQuoteReference);

    if (!existingQuote) {
      isUnique = true;
    } else {
      // Utilizamos la última referencia encontrada para continuar la generación
      lastQuoteReference = newQuoteReference;
    }
  }

  return newQuoteReference;
};

const findQuoteById = async (
  id: UniqueID,
  quoteRepository: IQuoteRepository
): Promise<Quote | null> => {
  return quoteRepository.getById(id);
};

export { findQuoteById, generateQuoteReferenceForDealer };
