package sub

import (
	"context"
	"encoding/json"

	"github.com/nats-io/nats.go"
)

type (
	ChainEvent struct {
		Block           uint64 `json:"block"`
		From            string `json:"from"`
		To              string `json:"to"`
		ContractAddress string `json:"contractAddress"`
		Success         bool   `json:"success"`
		TxHash          string `json:"transactionHash"`
		TxIndex         uint   `json:"transactionIndex"`
		Value           uint64 `json:"value"`
	}
)

func (s *Sub) processEventHandler(ctx context.Context, msg *nats.Msg) error {
	var (
		chainEvent ChainEvent
	)

	if err := json.Unmarshal(msg.Data, &chainEvent); err != nil {
		return err
	}

	if err := s.cu.Store.UpdateDispatchStatus(
		ctx,
		chainEvent.Success,
		chainEvent.TxHash,
		chainEvent.Block,
	); err != nil {
		return err
	}

	if chainEvent.Success {
		switch msg.Subject {
		case "CHAIN.register":
			if err := s.cu.Store.ActivateAccount(ctx, chainEvent.To); err != nil {
				return err
			}

			if err := s.cu.Store.GasUnlock(ctx, chainEvent.To); err != nil {
				return err
			}
		case "CHAIN.gas":
			if err := s.cu.Store.GasUnlock(ctx, chainEvent.To); err != nil {
				return err
			}
		}
	}

	return nil
}
