package dpcore_test

import (
	"net/url"
	"testing"

	"imuslab.com/zoraxy/mod/dynamicproxy/dpcore"
)

func TestReplaceLocationHost(t *testing.T) {
	tests := []struct {
		name           string
		urlString      string
		rrr            *dpcore.ResponseRewriteRuleSet
		useTLS         bool
		expectedResult string
		expectError    bool
	}{
		{
			name:           "Basic HTTP to HTTPS redirection",
			urlString:      "http://example.com/resource",
			rrr:            &dpcore.ResponseRewriteRuleSet{ProxyDomain: "example.com", OriginalHost: "proxy.example.com", UseTLS: true},
			useTLS:         true,
			expectedResult: "https://proxy.example.com/resource",
			expectError:    false,
		},

		{
			name:           "Basic HTTPS to HTTP redirection",
			urlString:      "https://proxy.example.com/resource",
			rrr:            &dpcore.ResponseRewriteRuleSet{ProxyDomain: "proxy.example.com", OriginalHost: "proxy.example.com", UseTLS: false},
			useTLS:         false,
			expectedResult: "http://proxy.example.com/resource",
			expectError:    false,
		},
		{
			name:           "No rewrite on mismatched domain",
			urlString:      "http://anotherdomain.com/resource",
			rrr:            &dpcore.ResponseRewriteRuleSet{ProxyDomain: "proxy.example.com", OriginalHost: "proxy.example.com", UseTLS: true},
			useTLS:         true,
			expectedResult: "http://anotherdomain.com/resource",
			expectError:    false,
		},
		{
			name:           "Subpath trimming with HTTPS",
			urlString:      "https://blog.example.com/post?id=1",
			rrr:            &dpcore.ResponseRewriteRuleSet{ProxyDomain: "blog.example.com", OriginalHost: "proxy.example.com/blog", UseTLS: true},
			useTLS:         true,
			expectedResult: "https://proxy.example.com/blog/post?id=1",
			expectError:    false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result, err := dpcore.ReplaceLocationHost(tt.urlString, tt.rrr, tt.useTLS)
			if (err != nil) != tt.expectError {
				t.Errorf("Expected error: %v, got: %v", tt.expectError, err)
			}
			if result != tt.expectedResult {
				result, _ = url.QueryUnescape(result)
				t.Errorf("Expected result: %s, got: %s", tt.expectedResult, result)
			}
		})
	}
}

func TestReplaceLocationHostRelative(t *testing.T) {
	urlString := "api/"
	rrr := &dpcore.ResponseRewriteRuleSet{
		OriginalHost: "test.example.com",
		ProxyDomain:  "private.com/test",
		UseTLS:       true,
	}
	useTLS := true

	expectedResult := "api/"

	result, err := dpcore.ReplaceLocationHost(urlString, rrr, useTLS)
	if err != nil {
		t.Errorf("Error occurred: %v", err)
	}

	if result != expectedResult {
		t.Errorf("Expected: %s, but got: %s", expectedResult, result)
	}
}