package main

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

	"github.com/aws/aws-lambda-go/lambda"
	"github.com/spf13/pflag"

	"github.com/tidbcloud/infra-provider/cluster-controller/tests/cmd/end-user-proxy/mysql"
)

func Handle(ctx context.Context, ac *mysql.Action) error {
	in := mysql.NewLocal()
	return in.Invoke(ctx, ac)
}

func HttpHandler(w http.ResponseWriter, r *http.Request) {
	bs, err := io.ReadAll(r.Body)
	if err != nil {
		w.WriteHeader(http.StatusInternalServerError)
		return
	}
	req := mysql.Action{}
	if err := json.Unmarshal(bs, &req); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		return
	}

	if err := Handle(r.Context(), &req); err != nil {
		w.WriteHeader(http.StatusUnprocessableEntity)
		fmt.Fprintf(w, `{"error":"%v"}`, err)
	}

}

func main() {
	mode := pflag.StringP("mode", "m", "lambda", "lambda or http mode")
	port := pflag.Int("port", 8080, "port for http server")
	if *mode == "lambda" {
		lambda.Start(Handle)
		return
	}

	http.ListenAndServe(":"+strconv.Itoa(*port), http.HandlerFunc(HttpHandler))
}
