package config

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

func TestLoadConfigParsesDeadlockRetry(t *testing.T) {
	dir := t.TempDir()
	path := filepath.Join(dir, "config.yaml")
	content := []byte(`
mysql:
  retry:
    deadlock:
      enabled: false
      max_attempts: 5
      base_backoff: 20ms
      max_backoff: 250ms
`)
	if err := os.WriteFile(path, content, 0o644); err != nil {
		t.Fatalf("write config failed: %v", err)
	}

	cfg, err := LoadConfig(path)
	if err != nil {
		t.Fatalf("load config failed: %v", err)
	}

	d := cfg.MySQL.Retry.Deadlock
	if d.Enabled == nil || *d.Enabled {
		t.Fatalf("expected enabled=false, got %v", d.Enabled)
	}
	if d.MaxAttempts != 5 {
		t.Fatalf("expected max_attempts 5, got %d", d.MaxAttempts)
	}
	if d.BaseBackoff != 20*time.Millisecond {
		t.Fatalf("expected base_backoff 20ms, got %s", d.BaseBackoff)
	}
	if d.MaxBackoff != 250*time.Millisecond {
		t.Fatalf("expected max_backoff 250ms, got %s", d.MaxBackoff)
	}
}

func TestLoadConfigDeadlockRetryUnsetLeavesEnabledNil(t *testing.T) {
	dir := t.TempDir()
	path := filepath.Join(dir, "config.yaml")
	if err := os.WriteFile(path, []byte{}, 0o644); err != nil {
		t.Fatalf("write config failed: %v", err)
	}

	cfg, err := LoadConfig(path)
	if err != nil {
		t.Fatalf("load config failed: %v", err)
	}
	if cfg.MySQL.Retry.Deadlock.Enabled != nil {
		t.Fatalf("expected unset enabled to remain nil (executor defaults it on), got %v", *cfg.MySQL.Retry.Deadlock.Enabled)
	}
}

func TestDrainDefaultsAreCoherent(t *testing.T) {
	cfg := DefaultConfig()
	if cfg.Server.Drain.ReadinessDelay <= 0 {
		t.Fatalf("readiness_delay default must be positive, got %s", cfg.Server.Drain.ReadinessDelay)
	}
	if cfg.Server.Drain.WaitTimeout <= 0 {
		t.Fatalf("wait_timeout default must be positive, got %s", cfg.Server.Drain.WaitTimeout)
	}
	// The drain budget must stay well under a conservative k8s grace period so
	// SIGKILL never truncates drain.
	budget := cfg.Server.Drain.ReadinessDelay + cfg.Server.Drain.WaitTimeout
	if budget >= 120*time.Second {
		t.Fatalf("drain budget %s too close to typical grace periods", budget)
	}
}
