import { Block } from '../../types';
import {
  parseTimestampToMillis, 
  calculateAgeInMillis,
  parseHexToDecimal,
  formatGasValue,
  calculateGasPercentage
} from '../../utils/formatters';


export interface FormattedBlock {
  id: string;
  number: string;
  numberDecimal: number;
  hash: string;
  timestamp: number;
  age: number; 
  txCount: number;
  size: string;
  sizeBytes: number;
  status: string;
  gasLimit: string;
  gasLimitDecimal: number;
  gasUsed: string;
  gasUsedDecimal: number;
  gasUsedPercentage: number;
  baseFee: string; 
  stateRoot?: string;
  receiptsRoot?: string;
  extraData?: string;
  logsBloom?: string;
  difficulty?: string;
  totalDifficulty?: string;
  nonce?: string;
  mixHash?: string;
  sha3Uncles?: string;
  sendCount?: string;
  sendRoot?: string;
  l1BlockNumber?: number;
  validator?: string;
  parentHash?: string;
  rootHash?: string;
  transactions?: any[];
  batchId?: string | number;
  batchStatus?: string;
}

/**
 * 
 * @param {Block} block 
 * @returns {FormattedBlock} 
 */
export function formatBlockForDisplay(block: Block): FormattedBlock {
  const numberDecimal = parseHexToDecimal(block.number);
  

  const id = `B-${numberDecimal}`;

  const timestamp = parseTimestampToMillis(block.timestamp);
  const age = calculateAgeInMillis(block.timestamp);

  const txCount = typeof block.txCount !== 'undefined' && block.txCount !== null
    ? Number(block.txCount)
    : Array.isArray(block.transactions)
      ? block.transactions.length 
      : 0;
  
  const sizeBytes = parseHexToDecimal(block.size);
  const size = sizeBytes > 0 ? `${(sizeBytes / 1024).toFixed(2)} KB` : 'N/A';
  
  let statusValue = block.status || block.batchStatus || 'N/A';
  if (statusValue && typeof statusValue === 'string') {
    statusValue = statusValue.charAt(0).toUpperCase() + statusValue.slice(1).toLowerCase();
  }
  

  const gasLimitDecimal = parseHexToDecimal(block.gasLimit);
  const gasLimit = gasLimitDecimal > 0 ? gasLimitDecimal.toString() : 'N/A';
  

  const gasUsedDecimal = parseHexToDecimal(block.gasUsed);
  const gasUsed = gasUsedDecimal > 0 ? gasUsedDecimal.toString() : 'N/A';
  

  const gasUsedPercentage = calculateGasPercentage(block.gasUsed, block.gasLimit);
  

  const gasPriceField = block.baseFeePerGas || block.baseFee || block.minimumGasPrice || block.gasPrice;

  const baseFee = gasPriceField ? formatGasValue(gasPriceField, 'gwei', 2).replace(' Gwei', '') : 'N/A';
  

  let l1BlockNumber: number | undefined = undefined;
  if (block.l1BlockNumber) {
    l1BlockNumber = parseHexToDecimal(block.l1BlockNumber);
  }
  
  return {
    id,
    number: block.number,
    numberDecimal,
    hash: block.hash,
    timestamp,
    age,
    txCount,
    size,
    sizeBytes,
    status: statusValue,
    gasLimit,
    gasLimitDecimal,
    gasUsed,
    gasUsedDecimal,
    gasUsedPercentage,
    baseFee,
    stateRoot: block.stateRoot,
    receiptsRoot: block.receiptsRoot,
    extraData: block.extraData,
    logsBloom: block.logsBloom,
    difficulty: block.difficulty,
    totalDifficulty: block.totalDifficulty,
    nonce: block.nonce,
    mixHash: block.mixHash,
    sha3Uncles: block.sha3Uncles,
    sendCount: block.sendCount,
    sendRoot: block.sendRoot,
    l1BlockNumber,
    validator: block.validator,
    parentHash: block.parentHash,
    rootHash: block.rootHash,
    transactions: block.transactions,
    batchId: block.batchId,
    batchStatus: block.batchStatus
  };
} 