package genex

import (
	"context"
	"math/big"
	"time"

	"github.com/ethereum/go-ethereum/common"
)

// GetBlock 获取区块信息
func (c *Client) GetBlock(height int64) (*BlockInfo, error) {
	block, err := c.ethClient.BlockByNumber(context.Background(), big.NewInt(height))
	if err != nil {
		return nil, err
	}
	return &BlockInfo{
		Height:    block.Number().Int64(),
		Hash:      block.Hash().Hex(),
		Timestamp: time.Unix(int64(block.Time()), 0),
		TxCount:   len(block.Transactions()),
		Proposer:  block.Coinbase().Hex(),
	}, nil
}

// GetLatestBlock 获取最新区块
func (c *Client) GetLatestBlock() (*BlockInfo, error) {
	block, err := c.ethClient.BlockByNumber(context.Background(), nil)
	if err != nil {
		return nil, err
	}
	return &BlockInfo{
		Height:    block.Number().Int64(),
		Hash:      block.Hash().Hex(),
		Timestamp: time.Unix(int64(block.Time()), 0),
		TxCount:   len(block.Transactions()),
		Proposer:  block.Coinbase().Hex(),
	}, nil
}

// GetTransaction 获取交易详情
func (c *Client) GetTransaction(hash common.Hash) (*TransactionInfo, error) {
	tx, _, err := c.ethClient.TransactionByHash(context.Background(), hash)
	if err != nil {
		return nil, err
	}
	receipt, err := c.ethClient.TransactionReceipt(context.Background(), hash)
	if err != nil {
		return nil, err
	}
	status := "failed"
	if receipt.Status == 1 {
		status = "success"
	}
	return &TransactionInfo{
		Hash:        tx.Hash().Hex(),
		BlockHeight: receipt.BlockNumber.Int64(),
		From:        "", // 需要从签名恢复
		To:          tx.To().Hex(),
		Value:       tx.Value(),
		GasUsed:     receipt.GasUsed,
		Status:      status,
	}, nil
}

// GetStats 获取链统计
func (c *Client) GetStats() (*ChainStats, error) {
	block, err := c.ethClient.BlockByNumber(context.Background(), nil)
	if err != nil {
		return nil, err
	}
	return &ChainStats{
		BlockHeight: block.Number().Int64(),
	}, nil
}
