package api_test

import (
	"bytes"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"

	mockdb "git.nochill.in/nochill/hiling_go/db/mock"
	db "git.nochill.in/nochill/hiling_go/db/sqlc"
	"git.nochill.in/nochill/hiling_go/util"
	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/require"
	"go.uber.org/mock/gomock"
)

func TestSignupAPI(t *testing.T) {
	user, pass := createUser(t)
	t.Run("OK", func(t *testing.T) {
		ctrl := gomock.NewController(t)
		defer ctrl.Finish()

		store := mockdb.NewMockStore(ctrl)
		// store.EXPECT().
		// 	CreateUser(gomock.Any(), gomock.Any()).
		// 	Times(1).
		// 	Return(user, nil)

		server := newTestServer(t, store)
		recorder := httptest.NewRecorder()

		data, err := json.Marshal(gin.H{
			"username": user.Username,
			"password": pass,
		})
		require.NoError(t, err)

		url := "/user/signup"
		request, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(data))
		require.NoError(t, err)

		server.Router.ServeHTTP(recorder, request)
		require.Equal(t, http.StatusOK, recorder.Code)

	})
}

func createUser(t *testing.T) (user db.User, password string) {
	passw := util.RandomString(10)
	hashedPassword, err := util.HashPassword(passw)
	require.NoError(t, err)

	user = db.User{
		Username: util.RandomString(10),
		Password: hashedPassword,
	}

	return user, passw
}