package mysql

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

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/lambda"
)

func NewLambda(cfg aws.Config, fn string) Invoker {
	return &lambdaInvoker{
		c:  lambda.NewFromConfig(cfg),
		fn: fn,
	}
}

type lambdaInvoker struct {
	c  *lambda.Client
	fn string
}

func (in *lambdaInvoker) Invoke(ctx context.Context, ac *Action) error {
	bs, err := json.Marshal(ac)
	if err != nil {
		return err
	}

	res, err := in.c.Invoke(ctx, &lambda.InvokeInput{
		FunctionName: &in.fn,
		Payload:      bs,
	})
	if err != nil {
		return err
	}
	errList := []error{}
	if res.StatusCode != http.StatusOK {
		errList = append(errList, fmt.Errorf("status code is not 200 but %v", res.StatusCode))
	}
	if res.FunctionError != nil {
		errList = append(errList, fmt.Errorf("run lambda function err: %v", res.FunctionError))
	}
	if string(res.Payload) != `null` {
		errList = append(errList, fmt.Errorf("response is unexpected: %v", string(res.Payload)))
	}

	if len(errList) != 0 {
		return fmt.Errorf("call lambda failed: %v", errList)
	}

	return nil
}
