package auth

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

	"git.slaventius.ru/test3k/auth/internal/config"
	db "git.slaventius.ru/test3k/auth/internal/transport/grpc"

	mux "github.com/go-chi/chi/v5"
	"google.golang.org/grpc/status"
)

// ...
type AuthServer struct {
	db     *db.AuthDBClient
	Router *mux.Mux
	config *config.Config
	ctx    context.Context
}

func NewServer(ctx context.Context, config *config.Config) *AuthServer {
	s := &AuthServer{
		db:     db.NewDBClient(ctx, config),
		Router: mux.NewMux(),
		config: config,
		ctx:    ctx,
	}

	//
	s.Router.Post("/api/v1/login", login(s))
	s.Router.Post("/api/v1/registration", registration(s))
	s.Router.Post("/api/v1/confirmation", confirmation(s))

	return s
}

func (s *AuthServer) GracefulStop() error {
	return s.db.Close()
}

func login(s *AuthServer) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		uid := r.FormValue("uid")
		password := r.FormValue("password")
		err := s.db.Login(uid, password)
		if err != nil {
			status := status.Convert(err)
			w.Write([]byte(status.Message()))

			return
		}

		w.Write([]byte(fmt.Sprintf("Success login for %s", uid)))
	}
}

func registration(s *AuthServer) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		uid := r.FormValue("uid")
		email := r.FormValue("email")
		code, err := s.db.Registration(uid, email)
		if err != nil {
			status := status.Convert(err)
			w.Write([]byte(status.Message()))

			return
		}

		w.Write([]byte(fmt.Sprintf("Success registration for %s with code %s", uid, code)))
	}
}

func confirmation(s *AuthServer) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		code := r.FormValue("code")
		err := s.db.Confirmation(code)
		if err != nil {
			status := status.Convert(err)
			w.Write([]byte(status.Message()))

			return
		}

		w.Write([]byte(fmt.Sprintf("Success confirmation for %s", code)))
	}
}