export interface IssueTaxDocInput {
  side: 'vendor' | 'platform';
  amountAgorot: number;
  vatPct: number;
  buyer: { name: string; email?: string; phone?: string; taxId?: string };
  vendor: { vendorId: string; providerAccountId: string; legalName?: string; vatId?: string };
  lineItems: Array<{ description: string; quantity: 1; unitPriceAgorot: number }>;
  providerPaymentId: string;
  docType: 'invoice' | 'receipt' | 'invoice_receipt';
  idempotencyKey: string;
  metadata?: Record<string, string>;
}

export interface IssueTaxDocOk {
  ok: true;
  taxDocId: string;
  taxDocNumber: string;
  pdfUrl: string;
}
export interface IssueTaxDocFailure {
  ok: false;
  code: 'INVOICE_ERROR' | 'UNKNOWN';
  message: string;
}
export type IssueTaxDocOutcome = IssueTaxDocOk | IssueTaxDocFailure;

export interface InvoiceProvider {
  issueTaxDoc(input: IssueTaxDocInput): Promise<IssueTaxDocOutcome>;
  findTaxDocByIdempotencyKey(idempotencyKey: string): Promise<{
    taxDocId: string;
    taxDocNumber: string;
    side: IssueTaxDocInput['side'];
    amountAgorot: number;
    vatPct: number;
    vendorId: string;
    vendorAccountId: string;
    providerPaymentId: string;
    docType: IssueTaxDocInput['docType'];
    lineItems: IssueTaxDocInput['lineItems'];
  } | null>;
  voidTaxDoc(input: { taxDocId: string; reason: string }): Promise<{ ok: boolean }>;
  getTaxDocPdfUrl(taxDocId: string): Promise<string | null>;
}
