package handler_utils

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
	"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/utils"
	"io"
	"net/http"
	"os"
	"strings"
)

// ========================================================================
// HTTP functions
// ========================================================================

func ServeHTTPFunctions(ctx context.Context, lambdaHandler lambda.Handler, w http.ResponseWriter, req *http.Request) {

	// Read body
	buf := new(bytes.Buffer)
	_, err := buf.ReadFrom(req.Body)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	req.Body.Close()
	body := buf.String()

	// Read Query
	queryValues := req.URL.Query()
	query := map[string]string{}
	for key, values := range queryValues {
		query[key] = values[0]
	}

	// Call lambda function
	request := events.APIGatewayProxyRequest{
		Resource:              req.URL.Path,
		HTTPMethod:            req.Method,
		QueryStringParameters: query,
		Body:                  body,
	}

	jsonRequest, _ := json.Marshal(request)
	responseBytes, err := lambdaHandler.Invoke(ctx, jsonRequest)
	if err != nil {
		panic(err)
	}

	// Parse response
	response := map[string]any{}
	err = json.Unmarshal(responseBytes, &response)
	if err != nil {
		return
	}

	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(int(response["statusCode"].(float64)))
	_, _ = io.WriteString(w, response["body"].(string))
}

// ========================================================================
// SQS Functions
// ========================================================================

func ServeSQSFunctions(ctx context.Context, lambdaHandler lambda.Handler, w http.ResponseWriter, req *http.Request) {

	// Read body
	buf := new(bytes.Buffer)
	_, err := buf.ReadFrom(req.Body)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	req.Body.Close()
	body := buf.String()

	sqsType := req.URL.Path
	sqsType = strings.ReplaceAll(sqsType, "/sqs/", "")

	// Call lambda function
	sqsRequest, _ := json.Marshal(events.SQSEvent{
		Records: []events.SQSMessage{
			{
				Body: body,
				MessageAttributes: map[string]events.SQSMessageAttribute{
					"type": {
						StringValue: utils.PointerValue(sqsType),
					},
				},
			},
		},
	})

	responseBytes, err := lambdaHandler.Invoke(ctx, sqsRequest)
	if err != nil {
		panic(err)
	}

	// Parse response
	response := map[string]any{}
	err = json.Unmarshal(responseBytes, &response)
	if err != nil {
		_, _ = io.WriteString(w, err.Error())
		return
	}

	_, _ = io.WriteString(w, "done")
}