import { ethers } from 'ethers';

interface PaymentPayload {
    merchantAddress: string;
    paymentId: string;
    amount: string;
    token: string;
    chainId: number;
    timestamp: number;
}
interface QRScanResult {
    success: boolean;
    data?: string;
    payload?: PaymentPayload;
    error?: string;
}
interface QRPayload {
    ma: string;
    pid: string;
    a: string;
}

/**
 * Generate a QR for a payment and listen for payment confirmation on-chain
 */
declare function generateQrAndListen(payload: QRPayload, provider: ethers.BrowserProvider): Promise<{
    qrDataUrl: string;
    event: ethers.ContractEventPayload;
    eventArgs: any;
    receipt: ethers.TransactionReceipt;
}>;

/**
 * Scan a QR code, decode it to a PaymentPayload, and execute payment.
 * @param provider - Injected Ethereum provider (e.g., MetaMask)
 * @param account - User wallet address
 */
declare function scanDecodeAndPay(provider: ethers.BrowserProvider, account: string): Promise<QRPayload | null>;

/**
 * Scan QR codes using camera
 */
declare function scanQr(elementId: string, onScan: (result: string) => void, { fps, qrbox }?: {
    fps?: number | undefined;
    qrbox?: {
        width: number;
        height: number;
    } | undefined;
}): Promise<{
    stop: () => Promise<void>;
}>;
/**
 * Generate QR code from PaymentPayload and return a Data URL
 * Browser-friendly version
 */
declare function generateQrFromPayload(payload: QRPayload): Promise<string>;

interface QRInputResult {
    success: boolean;
    payload?: QRPayload;
    rawString?: string;
    error?: string;
}
declare function parseQRInput(embedding: string): QRInputResult;

declare function encodePayment(payload: {
    paymentId: string;
    merchantAddress: string;
    amount: string;
}): string;
declare function decodePayment(base64String: string): QRPayload;
declare function validateEVMAddress(address: string): boolean;
declare function validatePaymentId(paymentId: string): boolean;
declare function formatAmount(amount: string, decimals?: number): string;

export { type PaymentPayload, type QRInputResult, type QRPayload, type QRScanResult, decodePayment, encodePayment, formatAmount, generateQrAndListen, generateQrFromPayload, parseQRInput, scanDecodeAndPay, scanQr, validateEVMAddress, validatePaymentId };
