package origin

import (
	"reflect"
	"testing"
)

func TestCanonicalOrigin(t *testing.T) {
	cases := []struct {
		raw  string
		want string
		ok   bool
	}{
		{"https://app.example", "https://app.example", true},
		{" https://app.example/ ", "https://app.example", true},
		{"http://localhost:5173", "http://localhost:5173", true},
		{"ftp://app.example", "", false},
		{"https://app.example/path", "", false},
		{"https://app.example?x=1", "", false},
		{"not a url", "", false},
	}
	for _, tc := range cases {
		t.Run(tc.raw, func(t *testing.T) {
			got, ok := CanonicalOrigin(tc.raw)
			if got != tc.want || ok != tc.ok {
				t.Fatalf("CanonicalOrigin(%q) = %q, %v; want %q, %v", tc.raw, got, ok, tc.want, tc.ok)
			}
		})
	}
}

func TestCanonicalOriginFromURL(t *testing.T) {
	cases := []struct {
		raw  string
		want string
		ok   bool
	}{
		{"https://app.example/oauth/callback?code=1", "https://app.example", true},
		{"http://localhost:5173/callback", "http://localhost:5173", true},
		{"http://127.0.0.1:5173/callback", "http://127.0.0.1:5173", true},
		{"http://app.example/callback", "", false},
		{"https://app.example/callback#frag", "", false},
	}
	for _, tc := range cases {
		t.Run(tc.raw, func(t *testing.T) {
			got, ok := CanonicalOriginFromURL(tc.raw)
			if got != tc.want || ok != tc.ok {
				t.Fatalf("CanonicalOriginFromURL(%q) = %q, %v; want %q, %v", tc.raw, got, ok, tc.want, tc.ok)
			}
		})
	}
}

func TestLoadConfigFromEnvAllowsConfiguredOriginsAndLoopback(t *testing.T) {
	t.Setenv("FRONTEND_URL", "http://localhost:5173")
	t.Setenv("CORS_ALLOWED_ORIGINS", "https://admin.example,https://app.example")

	cfg := LoadConfigFromEnv()
	want := []string{
		"https://admin.example",
		"https://app.example",
		"http://localhost:5173",
		"http://127.0.0.1:5173",
	}
	if got := cfg.AllowedOrigins(); !reflect.DeepEqual(got, want) {
		t.Fatalf("AllowedOrigins() = %#v, want %#v", got, want)
	}
	if !cfg.IsAllowedOrigin("http://127.0.0.1:5173") {
		t.Fatal("loopback origin was not accepted")
	}
}

func TestIsAllowedRedirectURI(t *testing.T) {
	t.Setenv("FRONTEND_URL", "https://app.example")
	t.Setenv("APP_HOST", "api.example")
	t.Setenv("GOOGLE_ALLOWED_REDIRECT_HOSTS", "auth.example,localhost")

	cfg := LoadConfigFromEnv()
	for _, raw := range []string{
		"https://app.example/callback",
		"https://api.example/oauth/callback",
		"https://auth.example/callback",
		"http://localhost:5173/callback",
		"http://127.0.0.1:5173/callback",
	} {
		if !cfg.IsAllowedRedirectURI(raw) {
			t.Fatalf("IsAllowedRedirectURI(%q) = false, want true", raw)
		}
	}
	if cfg.IsAllowedRedirectURI("https://evil.example/callback") {
		t.Fatal("unexpectedly allowed unknown redirect URI")
	}
}
