import { ethers } from 'ethers';
import { chain138ExplorerTxUrl, chain138TxHashFromLogTopic } from './chain138Explorer';

export type DecodedIsoAttestationLog = {
  chain138TxHash: string;
  chain138ExplorerUrl: string;
  instructionId: string;
  uetr: string;
  creditor: string;
  debtor: string;
  mainnetTxHash: string;
  mainnetExplorerUrl: string;
  blockNumber: string;
  logIndex: string;
};

type EtherscanLogRow = {
  topics?: string[];
  transactionHash?: string;
  blockNumber?: string;
  logIndex?: string;
  data?: string;
};

/** topic0 = PaymentAttested(bytes32,bytes32,address,address,bytes32,...) — matches cast sig-event */
export const PAYMENT_ATTESTED_TOPIC0 =
  '0x827a09f9798dc544d2acc52ecdad1fe0f5fa859be89a74a39dd7cb986b4cb340';

export function decodePaymentAttestedLogs(
  envelope: { status: string; result: EtherscanLogRow[] },
  explorerBase?: string
): DecodedIsoAttestationLog[] {
  if (envelope.status !== '1' || !Array.isArray(envelope.result)) return [];
  const out: DecodedIsoAttestationLog[] = [];
  for (const log of envelope.result) {
    const t = log.topics ?? [];
    if (t.length < 4 || !log.transactionHash) continue;
    const chain138TxHash = chain138TxHashFromLogTopic(t[1]);
    if (!chain138TxHash) continue;
    const instructionId = t[2] ?? '';
    const creditor = t[3] ? ethers.getAddress('0x' + t[3].slice(-40)) : '';
    let debtor = '';
    let uetr = '';
    if (log.data && log.data.length >= 130) {
      try {
        const decoded = ethers.AbiCoder.defaultAbiCoder().decode(
          ['address', 'bytes32', 'uint64', 'uint8', 'uint256', 'uint64', 'bytes32', 'bytes32', 'bytes32', 'bytes32', 'bytes32', 'bytes32', 'uint256'],
          log.data
        );
        debtor = String(decoded[0]);
        uetr = ethers.hexlify(decoded[1]);
      } catch {
        /* non-fatal */
      }
    }
    out.push({
      chain138TxHash,
      chain138ExplorerUrl: chain138ExplorerTxUrl(chain138TxHash, explorerBase),
      instructionId,
      uetr,
      creditor,
      debtor,
      mainnetTxHash: log.transactionHash,
      mainnetExplorerUrl: `https://etherscan.io/tx/${log.transactionHash}`,
      blockNumber: String(log.blockNumber ?? ''),
      logIndex: String(log.logIndex ?? ''),
    });
  }
  return out;
}
