//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//

package test

import (
	"testing"

	"github.com/apache/cloudstack-go/v2/cloudstack"
)

func TestLoadBalancerService(t *testing.T) {
	service := "LoadBalancerService"
	response, err := readData(service)
	if err != nil {
		t.Skipf("Skipping test as %v", err)
	}
	server := CreateTestServer(t, response)
	client := cloudstack.NewClient(server.URL, "APIKEY", "SECRETKEY", true)
	defer server.Close()

	testassignCertToLoadBalancer := func(t *testing.T) {
		if _, ok := response["assignCertToLoadBalancer"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewAssignCertToLoadBalancerParams("certid", "lbruleid")
		_, err := client.LoadBalancer.AssignCertToLoadBalancer(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("AssignCertToLoadBalancer", testassignCertToLoadBalancer)

	testassignToGlobalLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["assignToGlobalLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewAssignToGlobalLoadBalancerRuleParams("id", []string{})
		_, err := client.LoadBalancer.AssignToGlobalLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("AssignToGlobalLoadBalancerRule", testassignToGlobalLoadBalancerRule)

	testassignToLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["assignToLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewAssignToLoadBalancerRuleParams("id")
		_, err := client.LoadBalancer.AssignToLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("AssignToLoadBalancerRule", testassignToLoadBalancerRule)

	testcreateGlobalLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["createGlobalLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewCreateGlobalLoadBalancerRuleParams("gslbdomainname", "gslbservicetype", "name", 0)
		r, err := client.LoadBalancer.CreateGlobalLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("CreateGlobalLoadBalancerRule", testcreateGlobalLoadBalancerRule)

	testcreateLBHealthCheckPolicy := func(t *testing.T) {
		if _, ok := response["createLBHealthCheckPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewCreateLBHealthCheckPolicyParams("lbruleid")
		_, err := client.LoadBalancer.CreateLBHealthCheckPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("CreateLBHealthCheckPolicy", testcreateLBHealthCheckPolicy)

	testcreateLBStickinessPolicy := func(t *testing.T) {
		if _, ok := response["createLBStickinessPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewCreateLBStickinessPolicyParams("lbruleid", "methodname", "name")
		_, err := client.LoadBalancer.CreateLBStickinessPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("CreateLBStickinessPolicy", testcreateLBStickinessPolicy)

	testcreateLoadBalancer := func(t *testing.T) {
		if _, ok := response["createLoadBalancer"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewCreateLoadBalancerParams("algorithm", 0, "name", "networkid", "scheme", "sourceipaddressnetworkid", 0)
		r, err := client.LoadBalancer.CreateLoadBalancer(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("CreateLoadBalancer", testcreateLoadBalancer)

	testcreateLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["createLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewCreateLoadBalancerRuleParams("algorithm", "name", 0, 0)
		r, err := client.LoadBalancer.CreateLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("CreateLoadBalancerRule", testcreateLoadBalancerRule)

	testdeleteGlobalLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["deleteGlobalLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteGlobalLoadBalancerRuleParams("id")
		_, err := client.LoadBalancer.DeleteGlobalLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteGlobalLoadBalancerRule", testdeleteGlobalLoadBalancerRule)

	testdeleteLBHealthCheckPolicy := func(t *testing.T) {
		if _, ok := response["deleteLBHealthCheckPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteLBHealthCheckPolicyParams("id")
		_, err := client.LoadBalancer.DeleteLBHealthCheckPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteLBHealthCheckPolicy", testdeleteLBHealthCheckPolicy)

	testdeleteLBStickinessPolicy := func(t *testing.T) {
		if _, ok := response["deleteLBStickinessPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteLBStickinessPolicyParams("id")
		_, err := client.LoadBalancer.DeleteLBStickinessPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteLBStickinessPolicy", testdeleteLBStickinessPolicy)

	testdeleteLoadBalancer := func(t *testing.T) {
		if _, ok := response["deleteLoadBalancer"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteLoadBalancerParams("id")
		_, err := client.LoadBalancer.DeleteLoadBalancer(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteLoadBalancer", testdeleteLoadBalancer)

	testdeleteLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["deleteLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteLoadBalancerRuleParams("id")
		_, err := client.LoadBalancer.DeleteLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteLoadBalancerRule", testdeleteLoadBalancerRule)

	testdeleteServicePackageOffering := func(t *testing.T) {
		if _, ok := response["deleteServicePackageOffering"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteServicePackageOfferingParams("id")
		_, err := client.LoadBalancer.DeleteServicePackageOffering(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteServicePackageOffering", testdeleteServicePackageOffering)

	testdeleteSslCert := func(t *testing.T) {
		if _, ok := response["deleteSslCert"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeleteSslCertParams("id")
		_, err := client.LoadBalancer.DeleteSslCert(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeleteSslCert", testdeleteSslCert)

	testdeployNetscalerVpx := func(t *testing.T) {
		if _, ok := response["deployNetscalerVpx"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewDeployNetscalerVpxParams("serviceofferingid", "templateid", "zoneid")
		_, err := client.LoadBalancer.DeployNetscalerVpx(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("DeployNetscalerVpx", testdeployNetscalerVpx)

	testlistGlobalLoadBalancerRules := func(t *testing.T) {
		if _, ok := response["listGlobalLoadBalancerRules"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListGlobalLoadBalancerRulesParams()
		_, err := client.LoadBalancer.ListGlobalLoadBalancerRules(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListGlobalLoadBalancerRules", testlistGlobalLoadBalancerRules)

	testlistLBHealthCheckPolicies := func(t *testing.T) {
		if _, ok := response["listLBHealthCheckPolicies"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListLBHealthCheckPoliciesParams()
		_, err := client.LoadBalancer.ListLBHealthCheckPolicies(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListLBHealthCheckPolicies", testlistLBHealthCheckPolicies)

	testlistLBStickinessPolicies := func(t *testing.T) {
		if _, ok := response["listLBStickinessPolicies"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListLBStickinessPoliciesParams()
		_, err := client.LoadBalancer.ListLBStickinessPolicies(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListLBStickinessPolicies", testlistLBStickinessPolicies)

	testlistLoadBalancerRuleInstances := func(t *testing.T) {
		if _, ok := response["listLoadBalancerRuleInstances"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListLoadBalancerRuleInstancesParams("id")
		_, err := client.LoadBalancer.ListLoadBalancerRuleInstances(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListLoadBalancerRuleInstances", testlistLoadBalancerRuleInstances)

	testlistLoadBalancerRules := func(t *testing.T) {
		if _, ok := response["listLoadBalancerRules"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListLoadBalancerRulesParams()
		_, err := client.LoadBalancer.ListLoadBalancerRules(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListLoadBalancerRules", testlistLoadBalancerRules)

	testlistLoadBalancers := func(t *testing.T) {
		if _, ok := response["listLoadBalancers"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListLoadBalancersParams()
		_, err := client.LoadBalancer.ListLoadBalancers(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListLoadBalancers", testlistLoadBalancers)

	testlistRegisteredServicePackages := func(t *testing.T) {
		if _, ok := response["listRegisteredServicePackages"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListRegisteredServicePackagesParams()
		_, err := client.LoadBalancer.ListRegisteredServicePackages(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListRegisteredServicePackages", testlistRegisteredServicePackages)

	testlistSslCerts := func(t *testing.T) {
		if _, ok := response["listSslCerts"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewListSslCertsParams()
		_, err := client.LoadBalancer.ListSslCerts(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("ListSslCerts", testlistSslCerts)

	testremoveCertFromLoadBalancer := func(t *testing.T) {
		if _, ok := response["removeCertFromLoadBalancer"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewRemoveCertFromLoadBalancerParams("lbruleid")
		_, err := client.LoadBalancer.RemoveCertFromLoadBalancer(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("RemoveCertFromLoadBalancer", testremoveCertFromLoadBalancer)

	testremoveFromGlobalLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["removeFromGlobalLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewRemoveFromGlobalLoadBalancerRuleParams("id", []string{})
		_, err := client.LoadBalancer.RemoveFromGlobalLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("RemoveFromGlobalLoadBalancerRule", testremoveFromGlobalLoadBalancerRule)

	testremoveFromLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["removeFromLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewRemoveFromLoadBalancerRuleParams("id")
		_, err := client.LoadBalancer.RemoveFromLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("RemoveFromLoadBalancerRule", testremoveFromLoadBalancerRule)

	teststopNetScalerVpx := func(t *testing.T) {
		if _, ok := response["stopNetScalerVpx"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewStopNetScalerVpxParams("id")
		r, err := client.LoadBalancer.StopNetScalerVpx(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("StopNetScalerVpx", teststopNetScalerVpx)

	testupdateGlobalLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["updateGlobalLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUpdateGlobalLoadBalancerRuleParams("id")
		r, err := client.LoadBalancer.UpdateGlobalLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("UpdateGlobalLoadBalancerRule", testupdateGlobalLoadBalancerRule)

	testupdateLBHealthCheckPolicy := func(t *testing.T) {
		if _, ok := response["updateLBHealthCheckPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUpdateLBHealthCheckPolicyParams("id")
		_, err := client.LoadBalancer.UpdateLBHealthCheckPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("UpdateLBHealthCheckPolicy", testupdateLBHealthCheckPolicy)

	testupdateLBStickinessPolicy := func(t *testing.T) {
		if _, ok := response["updateLBStickinessPolicy"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUpdateLBStickinessPolicyParams("id")
		_, err := client.LoadBalancer.UpdateLBStickinessPolicy(p)
		if err != nil {
			t.Errorf(err.Error())
		}
	}
	t.Run("UpdateLBStickinessPolicy", testupdateLBStickinessPolicy)

	testupdateLoadBalancer := func(t *testing.T) {
		if _, ok := response["updateLoadBalancer"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUpdateLoadBalancerParams("id")
		r, err := client.LoadBalancer.UpdateLoadBalancer(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("UpdateLoadBalancer", testupdateLoadBalancer)

	testupdateLoadBalancerRule := func(t *testing.T) {
		if _, ok := response["updateLoadBalancerRule"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUpdateLoadBalancerRuleParams("id")
		r, err := client.LoadBalancer.UpdateLoadBalancerRule(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("UpdateLoadBalancerRule", testupdateLoadBalancerRule)

	testuploadSslCert := func(t *testing.T) {
		if _, ok := response["uploadSslCert"]; !ok {
			t.Skipf("Skipping as no json response is provided in testdata")
		}
		p := client.LoadBalancer.NewUploadSslCertParams("certificate", "name", "privatekey")
		r, err := client.LoadBalancer.UploadSslCert(p)
		if err != nil {
			t.Errorf(err.Error())
		}
		if r.Id == "" {
			t.Errorf("Failed to parse response. ID not found")
		}
	}
	t.Run("UploadSslCert", testuploadSslCert)

}
