import type { InvoiceProvider, IssueTaxDocInput, IssueTaxDocOutcome } from './provider.js';

export class MockInvoiceProvider implements InvoiceProvider {
  private readonly docs = new Map<
    string,
    NonNullable<Awaited<ReturnType<InvoiceProvider['findTaxDocByIdempotencyKey']>>>
  >();
  constructor(private readonly publicSiteUrl: string) {}

  async issueTaxDoc(input: IssueTaxDocInput): Promise<IssueTaxDocOutcome> {
    const existing = await this.findTaxDocByIdempotencyKey(input.idempotencyKey);
    if (existing)
      return {
        ok: true,
        ...existing,
        pdfUrl: `${this.publicSiteUrl}/mock-invoice/${existing.taxDocId}.pdf`,
      };
    const result = {
      ok: true as const,
      taxDocId: `mock_doc_${input.side}_${input.providerPaymentId}`,
      taxDocNumber: `M-${Date.now()}`,
      pdfUrl: `${this.publicSiteUrl}/mock-invoice/${input.side}/${input.providerPaymentId}.pdf`,
    };
    this.docs.set(input.idempotencyKey, {
      taxDocId: result.taxDocId,
      taxDocNumber: result.taxDocNumber,
      side: input.side,
      amountAgorot: input.amountAgorot,
      vatPct: input.vatPct,
      vendorId: input.vendor.vendorId,
      vendorAccountId: input.vendor.providerAccountId,
      providerPaymentId: input.providerPaymentId,
      docType: input.docType,
      lineItems: input.lineItems,
    });
    return result;
  }

  async findTaxDocByIdempotencyKey(idempotencyKey: string) {
    return this.docs.get(idempotencyKey) ?? null;
  }

  async voidTaxDoc(_input: { taxDocId: string; reason: string }): Promise<{ ok: boolean }> {
    return { ok: true };
  }

  async getTaxDocPdfUrl(taxDocId: string): Promise<string | null> {
    return `${this.publicSiteUrl}/mock-invoice/${taxDocId}.pdf`;
  }
}
