/*
 * Copyright (c) 2025 Bocloud Technologies Co., Ltd.
 * installer is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *          <http://license.coscl.org.cn/MulanPSL2>
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */

package bkeconfig

import (
	"os"
	"path/filepath"
	"testing"

	"github.com/agiledragon/gomonkey/v2"
	"github.com/stretchr/testify/assert"

	"gopkg.openfuyao.cn/bkeadm/pkg/executor/k8s"
	"gopkg.openfuyao.cn/bkeadm/pkg/global"
	"gopkg.openfuyao.cn/bkeadm/utils"
)

func TestEnsureNsExists_Success(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	mockK8sClient := &k8s.MockK8sClient{}
	global.K8s = mockK8sClient

	err := ensureNsExists("test-namespace")
	assert.NoError(t, err)
}

func TestEnsureNsExists_GetClientError(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	global.K8s = nil

	patches := gomonkey.NewPatches()

	defer patches.Reset()

	patches.ApplyFunc(k8s.NewKubernetesClient, func(string) (k8s.KubernetesClient, error) {
		return nil, assert.AnError
	})

	err := ensureNsExists("test-namespace")
	assert.Error(t, err)
}

func TestSetKubernetesConfig_AlreadyExists(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	mockK8sClient := &k8s.MockK8sClient{}
	global.K8s = mockK8sClient

	data := map[string]string{"key": "value"}
	err := SetKubernetesConfig(data, "test-config", "test-ns")
	assert.NoError(t, err)
}

func TestSetKubernetesConfig_NewClientError(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	global.K8s = nil

	patches := gomonkey.NewPatches()

	defer patches.Reset()

	patches.ApplyFunc(k8s.NewKubernetesClient, func(string) (k8s.KubernetesClient, error) {
		return nil, assert.AnError
	})

	data := map[string]string{"key": "value"}
	err := SetKubernetesConfig(data, "test-config", "test-ns")
	assert.Error(t, err)
}

func TestSetPatchConfig_Success(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	mockK8sClient := &k8s.MockK8sClient{}
	global.K8s = mockK8sClient

	tempDir := t.TempDir()
	yamlFile := filepath.Join(tempDir, "test.yaml")
	err := os.WriteFile(yamlFile, []byte("test: content"), utils.DefaultFilePermission)
	assert.NoError(t, err)

	err = SetPatchConfig("v1.0.0", yamlFile, "patch-config")
	assert.NoError(t, err)
}

func TestSetPatchConfig_ReadFileError(t *testing.T) {
	err := SetPatchConfig("v1.0.0", "/nonexistent/path.yaml", "patch-config")
	assert.Error(t, err)
}

func TestSetPatchConfig_CRFLContent(t *testing.T) {
	originalK8s := global.K8s
	defer func() { global.K8s = originalK8s }()

	mockK8sClient := &k8s.MockK8sClient{}
	global.K8s = mockK8sClient

	tempDir := t.TempDir()
	yamlFile := filepath.Join(tempDir, "test.yaml")
	content := "test: content\r\nanother: line\r\n"
	err := os.WriteFile(yamlFile, []byte(content), utils.DefaultFilePermission)
	assert.NoError(t, err)

	err = SetPatchConfig("v1.0.0", yamlFile, "patch-config")
	assert.NoError(t, err)
}