package db

import (
	"context"
	"log"
	"net"
	"strconv"

	"git.slaventius.ru/test3k/auth/internal/config"

	api "git.slaventius.ru/test3k/umate/pkg/api"

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

type AuthDBClient struct {
	config *config.Config
	client *grpc.ClientConn
	db     api.AuthDBClient
	ctx    context.Context
}

func NewDBClient(ctx context.Context, config *config.Config) *AuthDBClient {
	conStr := net.JoinHostPort(config.Db.Host, strconv.Itoa(config.Db.Port))
	// client, err := grpc.Dial(conStr, grpc.WithInsecure())
	client, err := grpc.Dial(conStr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}

	return &AuthDBClient{
		config: config,
		client: client,
		db:     api.NewAuthDBClient(client),
		ctx:    ctx,
	}
}

func (s *AuthDBClient) Close() error {
	return s.client.Close()
}

func (s *AuthDBClient) Login(uid string, password string) error {
	_, err := s.db.Login(s.ctx, &api.LoginRequest{
		Login:    uid,
		Password: password,
	})

	//
	if err != nil {
		return err
	}

	return nil
}

func (s *AuthDBClient) Registration(uid string, email string, password string) (string, error) {
	res, err := s.db.Registration(s.ctx, &api.RegistrationRequest{
		Login:    uid,
		Password: password,
		Email:    email,
	})

	//
	if err != nil {
		return "", err
	}

	return res.GetCode(), nil
}

func (s *AuthDBClient) Confirmation(code string) error {
	_, err := s.db.Confirmation(s.ctx, &api.ConfirmationRequest{
		Code: code,
	})

	//
	if err != nil {
		return err
	}

	return nil
}