package main

import (
	"context"
	"log"

	"fusen-basic/env"
	"fusen-gateway/gen/go/service"

	"fusen-gateway/server/config"
	"fusen-gateway/server/logic"

	"net/http"

	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

func main() {

	fusen := env.NewFusen[config.Config]()
	fusen.StartNacos(nil)
	service.AutoGrpcInit(fusen)

	ctx := context.Background()
	ctx, cancel := context.WithCancel(ctx)
	defer cancel()
	mux := runtime.NewServeMux(
		runtime.WithErrorHandler(func(ctx context.Context, sm *runtime.ServeMux, m runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
			log.Println(err)
			w.Write([]byte("\n" + err.Error()))
		}),
		runtime.WithMetadata(logic.PassMetadata),
		runtime.WithForwardResponseOption(logic.ResponseHeaderMatcher),
		runtime.WithMarshalerOption("*", &logic.EmptyMarshaler{}),
	)

	opts := []grpc.DialOption{
		grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
			log.Println(method)
			return invoker(ctx, method, req, reply, cc, opts...)
		}),
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	}

	err := logic.AutoRegisterHandler(ctx, mux, opts...)
	if err != nil {
		panic(err)
	}

	err = http.ListenAndServe(":9900", mux)
	if err != nil {
		panic(err)
	}
}