package sync

import (
	"encoding/json"
	"fmt"
	"io"

	"dejo_node/internal/transactions"

	network "github.com/libp2p/go-libp2p/core/network"
)

type SyncMessage struct {
	Type   string              `json:"type"`
	Height int64               `json:"height,omitempty"`
	Block  *transactions.Block `json:"block,omitempty"`
}

func (s *SyncManager) handleStream(stream network.Stream) {
	fmt.Println("📥 [SYNC] Conexão de:", stream.Conn().RemotePeer())
	defer stream.Close()

	decoder := json.NewDecoder(stream)
	encoder := json.NewEncoder(stream)

	for {
		var msg SyncMessage
		if err := decoder.Decode(&msg); err != nil {
			if err == io.EOF {
				return
			}
			fmt.Println("Erro ao decodificar mensagem de sync:", err)
			return
		}

		switch msg.Type {
		case "RequestHeight":
			latest, err := s.BlockStore.GetLatestBlock()
			if err != nil {
				fmt.Println("Erro ao obter bloco mais recente:", err)
				return
			}
			height := int64(latest.Index)
			resp := SyncMessage{
				Type:   "ResponseHeight",
				Height: height,
			}
			_ = encoder.Encode(resp)
			fmt.Println("↩️ Respondendo altura:", height)

		case "RequestBlock":
			blk, err := s.BlockStore.GetBlockByIndex(int(msg.Height))
			if err != nil {
				fmt.Println("❌ Erro ao buscar bloco:", err)
				return
			}
			resp := SyncMessage{
				Type:  "ResponseBlock",
				Block: blk,
			}
			_ = encoder.Encode(resp)
			fmt.Printf("📤 Enviando bloco altura %d\n", msg.Height)

		default:
			fmt.Println("Mensagem de sync desconhecida:", msg.Type)
		}
	}
}