package config

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

const trackersYAMLValid = `
trackers:
  - id: mam
    name: MyAnonamouse
    type: mam
    base_url: https://www.myanonamouse.net
    enabled: true
    scrape_interval_seconds: 600
    scrape_jitter_seconds: 120
    use_byparr: false
    config:
      stats_path: /jsonLoad.php
  - id: other
    name: AnotherTracker
    type: mam
    base_url: https://other.example
`

func TestLoadTrackersValid(t *testing.T) {
	doc, err := LoadTrackersFromBytes([]byte(trackersYAMLValid))
	if err != nil {
		t.Fatalf("LoadTrackersFromBytes: %v", err)
	}
	if len(doc.Trackers) != 2 {
		t.Fatalf("got %d trackers, want 2", len(doc.Trackers))
	}
	first := doc.Trackers[0]
	if first.ID != "mam" || first.ScrapeIntervalSeconds != 600 {
		t.Errorf("first tracker parsed wrong: %+v", first)
	}
	if !first.IsEnabled() {
		t.Error("first.IsEnabled() = false, want true")
	}
	// Second tracker has no scrape_interval_seconds; defaults apply.
	if doc.Trackers[1].ScrapeIntervalSeconds != 300 {
		t.Errorf("default interval not applied: %d", doc.Trackers[1].ScrapeIntervalSeconds)
	}
	if doc.Trackers[1].ScrapeJitterSeconds != 60 {
		t.Errorf("default jitter not applied: %d", doc.Trackers[1].ScrapeJitterSeconds)
	}
}

func TestLoadTrackersAbsentFileNotAnError(t *testing.T) {
	dir := t.TempDir()
	doc, err := LoadTrackersFromDir(dir)
	if err != nil {
		t.Fatalf("LoadTrackersFromDir: %v", err)
	}
	if len(doc.Trackers) != 0 {
		t.Errorf("expected 0 trackers from absent file, got %d", len(doc.Trackers))
	}
}

func TestLoadTrackersFromFile(t *testing.T) {
	dir := t.TempDir()
	if err := os.WriteFile(filepath.Join(dir, TrackersFileName), []byte(trackersYAMLValid), 0o644); err != nil {
		t.Fatalf("write: %v", err)
	}
	doc, err := LoadTrackersFromDir(dir)
	if err != nil {
		t.Fatalf("LoadTrackersFromDir: %v", err)
	}
	if len(doc.Trackers) != 2 {
		t.Errorf("got %d, want 2", len(doc.Trackers))
	}
}

func TestValidationRejects(t *testing.T) {
	cases := []struct {
		name string
		yaml string
		want string
	}{
		{"missing id", `trackers: [{type: mam, base_url: https://x}]`, "id required"},
		{"missing type", `trackers: [{id: a, base_url: https://x}]`, "type required"},
		{"missing base_url", `trackers: [{id: a, type: mam}]`, "base_url required"},
		{"duplicate id", `trackers: [{id: a, type: mam, base_url: https://x}, {id: a, type: mam, base_url: https://y}]`, "duplicate"},
		{"negative interval", `trackers: [{id: a, type: mam, base_url: https://x, scrape_interval_seconds: -5}]`, "non-negative"},
	}
	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			_, err := LoadTrackersFromBytes([]byte(tc.yaml))
			if err == nil {
				t.Fatalf("expected error containing %q", tc.want)
			}
			if !strings.Contains(err.Error(), tc.want) {
				t.Errorf("error %q missing %q", err.Error(), tc.want)
			}
		})
	}
}

func TestEnabledOmittedDefaultsTrue(t *testing.T) {
	doc, err := LoadTrackersFromBytes([]byte(`
trackers:
  - id: a
    type: mam
    base_url: https://x
`))
	if err != nil {
		t.Fatalf("Load: %v", err)
	}
	if !doc.Trackers[0].IsEnabled() {
		t.Error("IsEnabled() with omitted enabled = false, want true")
	}
}
