//go:build end2end

package end2end

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"log"
	"net/http/httptest"

	param "git.gocasts.ir/ebhomengo/niki/param/benefactor/benefactor"
	"github.com/labstack/echo/v4"
)

// CreateRequest is a utility function to create and send HTTP requests
func CreateRequest(method, url, token string, body interface{}) *httptest.ResponseRecorder {
	var buf bytes.Buffer
	if body != nil {
		err := json.NewEncoder(&buf).Encode(body)
		if err != nil {
			log.Fatalf("could not encode body: %v", err)
		}
	}

	req := httptest.NewRequest(method, url, &buf)
	req.Header.Set(echo.HeaderContentType, echo.MIMEApplicationJSON)
	req.Header.Set(echo.HeaderAuthorization, fmt.Sprintf("Bearer %s", token))

	rec := httptest.NewRecorder()
	testServer.Serve(rec, req)
	return rec
}

// LoginBenefactor is a utility function to login a benefactor and return the access token
func LoginBenefactor(phoneNumber string) string {
	sendOTPRes, err := services.BenefactorSvc.SendOtp(context.Background(), param.SendOtpRequest{
		PhoneNumber: phoneNumber,
	})
	if err != nil {
		log.Fatalf("failed to send OTP: %v", err)
	}

	registerRes, err := services.BenefactorSvc.LoginOrRegister(context.Background(), param.LoginOrRegisterRequest{
		PhoneNumber:      phoneNumber,
		VerificationCode: sendOTPRes.Code,
	})
	if err != nil {
		log.Fatalf("failed to register: %v", err)
	}

	return registerRes.Tokens.AccessToken
}
