/*
 * Copyright (c) 2026 Huawei Technologies Co., Ltd.
 * openFuyao 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 main

import (
	"flag"
	"io"
	"os"
	"testing"
)

func TestParseControllerManagerConfigUsesDefaults(t *testing.T) {
	t.Setenv("LOG_LEVEL", "")
	t.Setenv("AGENT_PORT", "")
	flags := flag.NewFlagSet("controller", flag.ContinueOnError)
	flags.SetOutput(io.Discard)
	config, err := parseControllerManagerConfig(flags, nil)
	if err != nil {
		t.Fatalf("parse defaults: %v", err)
	}

	if config.metricsAddr != "0" {
		t.Fatalf("expected default metrics address 0, got %q", config.metricsAddr)
	}
	if config.probeAddr != ":8081" {
		t.Fatalf("expected default probe address, got %q", config.probeAddr)
	}
	if config.enableLeaderElection {
		t.Fatalf("expected leader election disabled by default")
	}
	if config.logLevel != "info" {
		t.Fatalf("expected default log level info, got %q", config.logLevel)
	}
	if config.agentPort != 18080 {
		t.Fatalf("expected default agent port 18080, got %d", config.agentPort)
	}
}

func TestParseControllerManagerConfigReadsFlags(t *testing.T) {
	flags := flag.NewFlagSet("controller", flag.ContinueOnError)
	flags.SetOutput(io.Discard)
	t.Setenv("LOG_LEVEL", "debug")
	t.Setenv("AGENT_PORT", "19090")

	config, err := parseControllerManagerConfig(flags, []string{

		"--metrics-bind-address=:8080",
		"--health-probe-bind-address=:19090",
		"--leader-elect=true",
	})

	if err != nil {
		t.Fatalf("parse flags: %v", err)
	}
	if config.metricsAddr != ":8080" {
		t.Fatalf("expected custom metrics address, got %q", config.metricsAddr)
	}
	if config.probeAddr != ":19090" {
		t.Fatalf("expected custom probe address, got %q", config.probeAddr)
	}
	if !config.enableLeaderElection {
		t.Fatalf("expected leader election enabled")
	}
	if config.logLevel != "debug" {
		t.Fatalf("expected log level from env, got %q", config.logLevel)
	}
	if config.agentPort != 19090 {
		t.Fatalf("expected agent port from env, got %d", config.agentPort)
	}
}

func TestParseControllerManagerConfigRejectsInvalidAgentPort(t *testing.T) {
	flags := flag.NewFlagSet("controller", flag.ContinueOnError)
	flags.SetOutput(io.Discard)
	t.Setenv("AGENT_PORT", "not-a-port")

	if _, err := parseControllerManagerConfig(flags, nil); err == nil {
		t.Fatalf("expected invalid AGENT_PORT to fail")
	}
}

func TestParseControllerManagerConfigRejectsInvalidFlags(t *testing.T) {
	flags := flag.NewFlagSet("controller", flag.ContinueOnError)
	flags.SetOutput(io.Discard)
	if _, err := parseControllerManagerConfig(flags, []string{"--unknown-flag"}); err == nil {
		t.Fatalf("expected invalid flag to fail")
	}
}

func TestEnvOrDefault(t *testing.T) {
	previous := os.Getenv("WD_CONTROLLER_TEST_ENV")
	defer os.Setenv("WD_CONTROLLER_TEST_ENV", previous)

	os.Unsetenv("WD_CONTROLLER_TEST_ENV")
	if got := envOrDefault("WD_CONTROLLER_TEST_ENV", "fallback"); got != "fallback" {
		t.Fatalf("expected fallback, got %q", got)
	}
	os.Setenv("WD_CONTROLLER_TEST_ENV", "value")
	if got := envOrDefault("WD_CONTROLLER_TEST_ENV", "fallback"); got != "value" {
		t.Fatalf("expected env value, got %q", got)
	}
}