//
// 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.
//

// NOTE: IPv6 acceptance tests (TestAccCloudStackNetwork_ipv6*) are conditionally
// skipped when running against the CloudStack simulator because the simulator
// only supports IPv6 with advanced shared network offerings. These tests will
// run on real CloudStack environments with proper IPv6 support. Set the environment
// variable CLOUDSTACK_ENABLE_IPV6_TESTS=true to force-enable IPv6 tests.
// Unit tests for the IPv6 CIDR parsing logic are available in
// resource_cloudstack_network_unit_test.go and do not require a CloudStack instance.

package cloudstack

import (
	"fmt"
	"os"
	"strings"
	"testing"

	"github.com/apache/cloudstack-go/v2/cloudstack"
	"github.com/hashicorp/terraform-plugin-testing/helper/resource"
	"github.com/hashicorp/terraform-plugin-testing/terraform"
)

func TestAccCloudStackNetwork_basic(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_basic,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkBasicAttributes(&network),
					testAccCheckResourceTags(&network),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_project(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_project,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "project", "terraform"),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_vpc(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_vpc,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkVPCAttributes(&network),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_vpcProjectInheritance(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_vpcProjectInheritance,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkVPCAttributes(&network),
					// Verify the project was inherited from the VPC
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "project", "terraform"),
					testAccCheckCloudStackNetworkProjectInherited(&network),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_updateACL(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_acl,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkVPCAttributes(&network),
				),
			},
			{
				Config: testAccCloudStackNetwork_updateACL,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkVPCAttributes(&network),
				),
			},
			{
				Config: testAccCloudStackNetwork_updateACL_cleanup,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkVPCAttributes(&network),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_import(t *testing.T) {
	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_basic,
			},

			{
				ResourceName:            "cloudstack_network.foo",
				ImportState:             true,
				ImportStateVerify:       true,
				ImportStateVerifyIgnore: []string{"bypass_vlan_overlap_check"},
			},
		},
	})
}

func TestAccCloudStackNetwork_importProject(t *testing.T) {
	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_project,
			},

			{
				ResourceName:            "cloudstack_network.foo",
				ImportState:             true,
				ImportStateIdPrefix:     "terraform/",
				ImportStateVerify:       true,
				ImportStateVerifyIgnore: []string{"bypass_vlan_overlap_check"},
			},
		},
	})
}

// testAccPreCheckIPv6Support checks if IPv6 tests should run.
// IPv6 tests are skipped on the CloudStack simulator unless explicitly enabled
// via the CLOUDSTACK_ENABLE_IPV6_TESTS environment variable.
func testAccPreCheckIPv6Support(t *testing.T) {
	testAccPreCheck(t)

	// Allow explicit override to enable IPv6 tests
	if os.Getenv("CLOUDSTACK_ENABLE_IPV6_TESTS") == "true" {
		return
	}

	// Try to detect if we're running on the simulator by checking the API URL
	apiURL := os.Getenv("CLOUDSTACK_API_URL")
	if strings.Contains(apiURL, "localhost") || strings.Contains(apiURL, "127.0.0.1") {
		t.Skip("Skipping IPv6 test: CloudStack simulator does not support IPv6 for isolated networks. Set CLOUDSTACK_ENABLE_IPV6_TESTS=true to force-enable.")
	}
}

func TestAccCloudStackNetwork_ipv6(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheckIPv6Support(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_ipv6,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					testAccCheckCloudStackNetworkIPv6Attributes(&network),
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "ip6cidr", "2001:db8::/64"),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_ipv6_vpc(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheckIPv6Support(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_ipv6_vpc,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "ip6cidr", "2001:db8:1::/64"),
				),
			},
		},
	})
}

func TestAccCloudStackNetwork_ipv6_custom_gateway(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheckIPv6Support(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_ipv6_custom_gateway,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.foo", &network),
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "ip6cidr", "2001:db8:2::/64"),
					resource.TestCheckResourceAttr(
						"cloudstack_network.foo", "ip6gateway", "2001:db8:2::1"),
				),
			},
		},
	})
}

func testAccCheckCloudStackNetworkExists(
	n string, network *cloudstack.Network) resource.TestCheckFunc {
	return func(s *terraform.State) error {
		rs, ok := s.RootModule().Resources[n]
		if !ok {
			return fmt.Errorf("Not found: %s", n)
		}

		if rs.Primary.ID == "" {
			return fmt.Errorf("No network ID is set")
		}

		cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)
		ntwrk, _, err := cs.Network.GetNetworkByID(
			rs.Primary.ID,
			cloudstack.WithProject(rs.Primary.Attributes["project"]),
		)
		if err != nil {
			return err
		}

		if ntwrk.Id != rs.Primary.ID {
			return fmt.Errorf("Network not found")
		}

		*network = *ntwrk

		return nil
	}
}

func testAccCheckCloudStackNetworkBasicAttributes(
	network *cloudstack.Network) resource.TestCheckFunc {
	return func(s *terraform.State) error {

		if network.Name != "terraform-network" {
			return fmt.Errorf("Bad name: %s", network.Name)
		}

		if network.Displaytext != "terraform-network" {
			return fmt.Errorf("Bad display name: %s", network.Displaytext)
		}

		if network.Cidr != "10.1.1.0/24" {
			return fmt.Errorf("Bad CIDR: %s", network.Cidr)
		}

		if network.Networkofferingname != "DefaultIsolatedNetworkOfferingWithSourceNatService" {
			return fmt.Errorf("Bad network offering: %s", network.Networkofferingname)
		}

		return nil
	}
}

func testAccCheckCloudStackNetworkVPCAttributes(
	network *cloudstack.Network) resource.TestCheckFunc {
	return func(s *terraform.State) error {

		if network.Name != "terraform-network" {
			return fmt.Errorf("Bad name: %s", network.Name)
		}

		if network.Displaytext != "terraform-network" {
			return fmt.Errorf("Bad display name: %s", network.Displaytext)
		}

		if network.Cidr != "10.1.1.0/24" {
			return fmt.Errorf("Bad CIDR: %s", network.Cidr)
		}

		if network.Networkofferingname != "DefaultIsolatedNetworkOfferingForVpcNetworks" {
			return fmt.Errorf("Bad network offering: %s", network.Networkofferingname)
		}

		return nil
	}
}

func testAccCheckCloudStackNetworkIPv6Attributes(
	network *cloudstack.Network) resource.TestCheckFunc {
	return func(s *terraform.State) error {

		if network.Name != "terraform-network-ipv6" {
			return fmt.Errorf("Bad name: %s", network.Name)
		}

		if network.Displaytext != "terraform-network-ipv6" {
			return fmt.Errorf("Bad display name: %s", network.Displaytext)
		}

		if network.Cidr != "10.1.2.0/24" {
			return fmt.Errorf("Bad CIDR: %s", network.Cidr)
		}

		if network.Ip6cidr != "2001:db8::/64" {
			return fmt.Errorf("Bad IPv6 CIDR: %s", network.Ip6cidr)
		}

		if network.Networkofferingname != "DefaultIsolatedNetworkOfferingWithSourceNatService" {
			return fmt.Errorf("Bad network offering: %s", network.Networkofferingname)
		}

		return nil
	}
}

func testAccCheckCloudStackNetworkProjectInherited(
	network *cloudstack.Network) resource.TestCheckFunc {
	return func(s *terraform.State) error {

		if network.Project != "terraform" {
			return fmt.Errorf("Expected project to be 'terraform' (inherited from VPC), got: %s", network.Project)
		}

		return nil
	}
}

func testAccCheckCloudStackNetworkDestroy(s *terraform.State) error {
	cs := testAccProvider.Meta().(*cloudstack.CloudStackClient)

	for _, rs := range s.RootModule().Resources {
		if rs.Type != "cloudstack_network" {
			continue
		}

		if rs.Primary.ID == "" {
			return fmt.Errorf("No network ID is set")
		}

		_, _, err := cs.Network.GetNetworkByID(rs.Primary.ID)
		if err == nil {
			return fmt.Errorf("Network %s still exists", rs.Primary.ID)
		}
	}

	return nil
}

const testAccCloudStackNetwork_basic = `
resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
  zone = "Sandbox-simulator"
  tags = {
    terraform-tag = "true"
  }
}`

const testAccCloudStackNetwork_project = `
resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
  project = "terraform"
  zone = "Sandbox-simulator"
}`

const testAccCloudStackNetwork_vpc = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  zone = cloudstack_vpc.foo.zone
}`

const testAccCloudStackNetwork_acl = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network_acl" "foo" {
  name = "foo"
  vpc_id = cloudstack_vpc.foo.id
}

resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  acl_id = cloudstack_network_acl.foo.id
  zone = cloudstack_vpc.foo.zone
}`

const testAccCloudStackNetwork_updateACL = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network_acl" "bar" {
  name = "bar"
  vpc_id = cloudstack_vpc.foo.id
}

resource "cloudstack_network_acl" "foo" {
  name = "foo"
  vpc_id = cloudstack_vpc.foo.id
}

resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  acl_id = cloudstack_network_acl.bar.id
  zone = cloudstack_vpc.foo.zone
}`

const testAccCloudStackNetwork_updateACL_cleanup = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network_acl" "bar" {
  name = "bar"
  vpc_id = cloudstack_vpc.foo.id
}

resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  acl_id = cloudstack_network_acl.bar.id
  zone = cloudstack_vpc.foo.zone
}`

func TestAccCloudStackNetwork_l2NoCidr(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_l2NoCidr,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.l2", &network),
				),
			},
		},
	})
}

const testAccCloudStackNetwork_l2NoCidr = `
resource "cloudstack_network" "l2" {
  name             = "terraform-l2-network"
  display_text     = "terraform-l2-network"
  network_offering = "DefaultL2NetworkOffering"
  zone             = "Sandbox-simulator"
}`

func TestAccCloudStackNetwork_isolatedNoCidr(t *testing.T) {
	var network cloudstack.Network

	resource.Test(t, resource.TestCase{
		PreCheck:     func() { testAccPreCheck(t) },
		Providers:    testAccProviders,
		CheckDestroy: testAccCheckCloudStackNetworkDestroy,
		Steps: []resource.TestStep{
			{
				Config: testAccCloudStackNetwork_isolatedNoCidr,
				Check: resource.ComposeTestCheckFunc(
					testAccCheckCloudStackNetworkExists(
						"cloudstack_network.isolated_no_cidr", &network),
					resource.TestCheckResourceAttrSet(
						"cloudstack_network.isolated_no_cidr", "cidr"),
				),
			},
		},
	})
}

const testAccCloudStackNetwork_isolatedNoCidr = `
resource "cloudstack_network" "isolated_no_cidr" {
  name             = "terraform-isolated-no-cidr"
  display_text     = "terraform-isolated-no-cidr"
  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
  zone             = "Sandbox-simulator"
}`

const testAccCloudStackNetwork_ipv6 = `
resource "cloudstack_network" "foo" {
  name = "terraform-network-ipv6"
  display_text = "terraform-network-ipv6"
  cidr = "10.1.2.0/24"
  ip6cidr = "2001:db8::/64"
  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
  zone = "Sandbox-simulator"
}`

const testAccCloudStackNetwork_ipv6_vpc = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc-ipv6"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network" "foo" {
  name = "terraform-network-ipv6"
  display_text = "terraform-network-ipv6"
  cidr = "10.1.1.0/24"
  ip6cidr = "2001:db8:1::/64"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  zone = cloudstack_vpc.foo.zone
}`

const testAccCloudStackNetwork_ipv6_custom_gateway = `
resource "cloudstack_network" "foo" {
  name = "terraform-network-ipv6-custom"
  display_text = "terraform-network-ipv6-custom"
  cidr = "10.1.3.0/24"
  ip6cidr = "2001:db8:2::/64"
  ip6gateway = "2001:db8:2::1"
  network_offering = "DefaultIsolatedNetworkOfferingWithSourceNatService"
  zone = "Sandbox-simulator"
}`

const testAccCloudStackNetwork_vpcProjectInheritance = `
resource "cloudstack_vpc" "foo" {
  name = "terraform-vpc"
  cidr = "10.0.0.0/8"
  vpc_offering = "Default VPC offering"
  project = "terraform"
  zone = "Sandbox-simulator"
}

resource "cloudstack_network" "foo" {
  name = "terraform-network"
  display_text = "terraform-network"
  cidr = "10.1.1.0/24"
  network_offering = "DefaultIsolatedNetworkOfferingForVpcNetworks"
  vpc_id = cloudstack_vpc.foo.id
  zone = cloudstack_vpc.foo.zone
  # Note: project is NOT specified here - it should be inherited from the VPC
}`
