package suites

import (
	"context"
	"fmt"
	"testing"
	"time"

	"github.com/stretchr/testify/suite"
)

type NetworkACLSuite struct {
	suite.Suite
}

func NewNetworkACLSuite() *NetworkACLSuite {
	return &NetworkACLSuite{}
}

func (s *NetworkACLSuite) TestShouldAccessSecretUpon2FA() {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	wds, err := StartWebDriver()
	s.Require().NoError(err)

	defer func() {
		err = wds.Stop()
		s.Require().NoError(err)
	}()

	targetURL := fmt.Sprintf("%s/secret.html", SecureBaseURL)
	wds.doVisit(s.T(), targetURL)
	wds.verifyIsFirstFactorPage(ctx, s.T())

	wds.doRegisterAndLogin2FA(ctx, s.T(), "john", "password", false, targetURL)
	wds.verifySecretAuthorized(ctx, s.T())
}

// from network 192.168.240.201/32.
func (s *NetworkACLSuite) TestShouldAccessSecretUpon1FA() {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	wds, err := StartWebDriverWithProxy("http://proxy-client1.example.com:3128", GetWebDriverPort())
	s.Require().NoError(err)

	defer func() {
		err = wds.Stop()
		s.Require().NoError(err)
	}()

	targetURL := fmt.Sprintf("%s/secret.html", SecureBaseURL)
	wds.doVisit(s.T(), targetURL)
	wds.verifyIsFirstFactorPage(ctx, s.T())

	wds.doLoginOneFactor(ctx, s.T(), "john", "password",
		false, fmt.Sprintf("%s/secret.html", SecureBaseURL))
	wds.verifySecretAuthorized(ctx, s.T())
}

// from network 192.168.240.202/32.
func (s *NetworkACLSuite) TestShouldAccessSecretUpon0FA() {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	wds, err := StartWebDriverWithProxy("http://proxy-client2.example.com:3128", GetWebDriverPort())
	s.Require().NoError(err)

	defer func() {
		err = wds.Stop()
		s.Require().NoError(err)
	}()

	wds.doVisit(s.T(), fmt.Sprintf("%s/secret.html", SecureBaseURL))
	wds.verifySecretAuthorized(ctx, s.T())
}

func TestNetworkACLSuite(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping suite test in short mode")
	}

	suite.Run(t, NewNetworkACLSuite())
}
