package api

import (
	"encoding/json"
	"net/http"

	"github.com/grassrootseconomics/cic-custodial/internal/tasker"
	"github.com/labstack/echo/v4"
)

type (
	transferRequest struct {
		From           string `json:"from" validate:"required,eth_addr"`
		To             string `json:"to" validate:"required,eth_addr"`
		VoucherAddress string `json:"voucherAddress" validate:"required,eth_addr"`
		Amount         string `json:"amount" validate:"required,numeric"`
	}

	transferResponse struct {
		TaskRef string `json:"taskRef"`
	}
)

func TransferHandler(
	taskerClient *tasker.TaskerClient,
) func(echo.Context) error {
	return func(c echo.Context) error {
		transferPayload := new(transferRequest)

		if err := c.Bind(transferPayload); err != nil {
			return echo.NewHTTPError(http.StatusBadRequest, errResp{
				Ok:    false,
				Error: BIND_ERROR,
			})
		}
		if err := c.Validate(transferPayload); err != nil {
			return err
		}

		taskPayload, err := json.Marshal(transferPayload)
		if err != nil {
			return echo.NewHTTPError(http.StatusInternalServerError, errResp{
				Ok:    false,
				Error: JSON_MARSHAL_ERROR,
			})
		}

		task, err := taskerClient.CreateTask(
			tasker.TransferTokenTask,
			tasker.DefaultPriority,
			&tasker.Task{
				Payload: taskPayload,
			},
		)
		if err != nil {
			return echo.NewHTTPError(http.StatusInternalServerError, errResp{
				Ok:    false,
				Error: TASK_CHAIN_ERROR,
			})
		}

		return c.JSON(http.StatusOK, okResp{
			Ok: true,
			Data: transferResponse{
				TaskRef: task.ID,
			},
		})
	}
}