package config

import (
	"testing"
	"time"
)

func TestLoadFromEnv(t *testing.T) {
	t.Setenv("SENTRY_ENV", "staging")
	t.Setenv("SENTRY_REGION", "ap-northeast-1")
	t.Setenv("SENTRY_S3_BUCKET", "nexus-sentry-staging")
	t.Setenv("SENTRY_CRM_INTERNAL_URL", "http://crm.internal:8081/internal/sentry-metrics")
	t.Setenv("SENTRY_CYCLE_INTERVAL", "10m")
	t.Setenv("SENTRY_RESET_SCHEDULE", "01:00,10:00")
	t.Setenv("SENTRY_RESET_WINDOW_MIN", "20")
	t.Setenv("SENTRY_RESET_EPOCH_REFERENCE", "2026-01-01T00:00:00Z")

	cfg, err := Load()
	if err != nil {
		t.Fatal(err)
	}
	if cfg.Env != "staging" {
		t.Errorf("env=%s", cfg.Env)
	}
	if cfg.CycleInterval != 10*time.Minute {
		t.Errorf("interval=%v", cfg.CycleInterval)
	}
	if len(cfg.ResetSchedule) != 2 {
		t.Errorf("schedule len=%d", len(cfg.ResetSchedule))
	}
	if cfg.ResetSchedule[0].Hour != 1 || cfg.ResetSchedule[0].Minute != 0 {
		t.Errorf("first reset %+v", cfg.ResetSchedule[0])
	}
	if cfg.ResetSchedule[1].Hour != 10 || cfg.ResetSchedule[1].Minute != 0 {
		t.Errorf("second reset %+v", cfg.ResetSchedule[1])
	}
	if cfg.ResetWindow != 20*time.Minute {
		t.Errorf("window=%v", cfg.ResetWindow)
	}
	expectedRef, _ := time.Parse(time.RFC3339, "2026-01-01T00:00:00Z")
	if !cfg.ResetEpochReference.Equal(expectedRef) {
		t.Errorf("reference=%v", cfg.ResetEpochReference)
	}
}

func TestLoadMissingRequired(t *testing.T) {
	t.Setenv("SENTRY_ENV", "")
	if _, err := Load(); err == nil {
		t.Fatal("want error for missing env")
	}
}

func TestLoadNoResetSchedule(t *testing.T) {
	t.Setenv("SENTRY_ENV", "prod")
	t.Setenv("SENTRY_RESET_SCHEDULE", "")
	cfg, err := Load()
	if err != nil {
		t.Fatal(err)
	}
	if len(cfg.ResetSchedule) != 0 {
		t.Errorf("want no schedule, got %d entries", len(cfg.ResetSchedule))
	}
}

func TestParseResetSchedule_Invalid(t *testing.T) {
	cases := []string{"25:00", "12:60", "noon", "12", "12:", ":30"}
	for _, s := range cases {
		if _, err := parseResetSchedule(s); err == nil {
			t.Errorf("expected error for %q", s)
		}
	}
}
