package keeper

import (
	"context"

	"github.com/0glabs/0g-chain/x/das/v1/types"
	sdk "github.com/cosmos/cosmos-sdk/types"
	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
)

var _ types.MsgServer = &Keeper{}

// RequestDAS handles MsgRequestDAS messages
func (k Keeper) RequestDAS(
	goCtx context.Context, msg *types.MsgRequestDAS,
) (*types.MsgRequestDASResponse, error) {
	ctx := sdk.UnwrapSDKContext(goCtx)

	requestID, err := k.StoreNewDASRequest(ctx, msg.StreamID, msg.BatchHeaderHash, msg.NumBlobs)
	if err != nil {
		return nil, err
	}
	k.IncrementNextRequestID(ctx)
	return &types.MsgRequestDASResponse{
		RequestID: requestID,
	}, nil
}

// ReportDASResult handles MsgReportDASResult messages
func (k Keeper) ReportDASResult(
	goCtx context.Context, msg *types.MsgReportDASResult,
) (*types.MsgReportDASResultResponse, error) {
	ctx := sdk.UnwrapSDKContext(goCtx)

	sampler, err := sdk.ValAddressFromBech32(msg.Sampler)
	if err != nil {
		return nil, err
	}

	if _, found := k.stakingKeeperRef.GetValidator(ctx, sampler); !found {
		return nil, stakingtypes.ErrNoValidatorFound
	}

	if err := k.StoreNewDASResponse(ctx, msg.RequestID, sampler, msg.Results); err != nil {
		return nil, err
	}

	return &types.MsgReportDASResultResponse{}, nil
}