

import { FormattedBlock } from './utils';
import { EnhancedBlock } from '../../types';
import { parseBlockchainTimestamp } from '../../utils/formatters';

export interface ExportResult {
  content: string;
  filename: string;
  dataType: string;
}

/**
 *
 * @param {FormattedBlock} block 
 * @returns {Object} 
 */
export function formatBlockForJsonExport(block: FormattedBlock | EnhancedBlock): Record<string, any> {
  return {
    blockNumber: block.number,
    blockHash: block.hash || '',
    timestamp: parseBlockchainTimestamp(block.timestamp).toISOString(),
    status: block.status,
    transactions: block.txCount,
    size: block.size,
    gasUsed: block.gasUsed,
    gasLimit: block.gasLimit,
    validator: block.validator || '',
    parentHash: block.parentHash || '',
    rootHash: block.rootHash || '',
    extraData: block.extraData || '',
    baseFeePerGas: block.baseFee || '',
    l1BlockNumber: block.l1BlockNumber || null,
    logsBloom: block.logsBloom || '',
    difficulty: block.difficulty || '',
    mixHash: block.mixHash || '',
    nonce: block.nonce || '',
    sha3Uncles: block.sha3Uncles || '',
    totalDifficulty: block.totalDifficulty || '',
    sendCount: block.sendCount || '',
    sendRoot: block.sendRoot || '',
    stateRoot: block.stateRoot || '',
    receiptsRoot: block.receiptsRoot || ''
  };
}

/**
 * 
 * @returns {string} 
 */
export function getBlockCsvHeaders(): string {
  return 'Block Number,Timestamp,Status,Transactions,Size,Gas Used,Gas Limit,Validator,Parent Hash,Root Hash,L1 Block Number,Logs Bloom,Difficulty,Mix Hash,Nonce,Sha3 Uncles,Total Difficulty,Send Count,Send Root,State Root,Receipts Root';
}

/**
 * 
 * @param {FormattedBlock} block 
 * @returns {string} 
 */
export function formatBlockForCsvExport(block: FormattedBlock | EnhancedBlock): string {
  const row = [
    block.numberDecimal,
    parseBlockchainTimestamp(block.timestamp).toISOString(),
    block.status,
    block.txCount,
    block.size,
    block.gasUsed,
    block.gasLimit,
    block.validator || '',
    block.parentHash || '',
    block.rootHash || '',
    block.l1BlockNumber || '',
    block.logsBloom || '',
    block.difficulty || '',
    block.mixHash || '',
    block.nonce || '',
    block.sha3Uncles || '',
    block.totalDifficulty || '',
    block.sendCount || '',
    block.sendRoot || '',
    block.stateRoot || '',
    block.receiptsRoot || ''
  ];
  
  return row.map(field => {
    if (field === null || field === undefined) return '';
    const str = String(field);
    return str.includes(',') ? `"${str}"` : str;
  }).join(',');
}

/**
 * 
 * @param {FormattedBlock} block 
 * @param {string} format 
 * @returns {ExportResult} 
 */
export function formatBlockDataForExport(block: FormattedBlock | EnhancedBlock, format: 'json' | 'csv'): ExportResult {
  if (format === 'json') {
    const jsonData = formatBlockForJsonExport(block);
    
    if (block.transactions && Array.isArray(block.transactions)) {
      jsonData.transactionsPreview = block.transactions.slice(0, 5).map(tx => ({
        hash: tx.hash,
        from: tx.from,
        to: tx.to,
        value: tx.value,
        status: tx.status
      }));
    }
    
    return {
      content: JSON.stringify(jsonData, null, 2),
      filename: `block-${block.numberDecimal}.json`,
      dataType: 'application/json'
    };
  } else if (format === 'csv') {
    const headers = getBlockCsvHeaders();
    const row = formatBlockForCsvExport(block);
    
    return {
      content: `${headers}\n${row}`,
      filename: `block-${block.numberDecimal}.csv`,
      dataType: 'text/csv'
    };
  } else {
    throw new Error('Unsupported export format');
  }
} 