package models

import (
	"encoding/json"
	"testing"
)

func TestUserGoogleInfo_Creation(t *testing.T) {
	userInfo := UserGoogleInfo{
		Email:   "user@gmail.com",
		Picture: "https://example.com/picture.jpg",
	}

	if userInfo.Email != "user@gmail.com" {
		t.Errorf("Expected email 'user@gmail.com', got '%s'", userInfo.Email)
	}

	if userInfo.Picture != "https://example.com/picture.jpg" {
		t.Errorf("Expected picture URL 'https://example.com/picture.jpg', got '%s'", userInfo.Picture)
	}
}

func TestUserGoogleInfo_EmptyFields(t *testing.T) {
	userInfo := UserGoogleInfo{}

	if userInfo.Email != "" {
		t.Errorf("Expected empty email, got '%s'", userInfo.Email)
	}

	if userInfo.Picture != "" {
		t.Errorf("Expected empty picture, got '%s'", userInfo.Picture)
	}
}

func TestUserGoogleInfo_JSONMarshaling(t *testing.T) {
	userInfo := UserGoogleInfo{
		Email:   "test@example.com",
		Picture: "https://example.com/photo.jpg",
	}

	// Marshal to JSON
	jsonData, err := json.Marshal(userInfo)
	if err != nil {
		t.Fatalf("Failed to marshal UserGoogleInfo: %v", err)
	}

	expectedJSON := `{"email":"test@example.com","picture":"https://example.com/photo.jpg"}`
	if string(jsonData) != expectedJSON {
		t.Errorf("Expected JSON '%s', got '%s'", expectedJSON, string(jsonData))
	}
}

func TestUserGoogleInfo_JSONUnmarshaling(t *testing.T) {
	jsonData := []byte(`{"email":"unmarshaled@example.com","picture":"https://example.com/image.png"}`)

	var userInfo UserGoogleInfo
	err := json.Unmarshal(jsonData, &userInfo)
	if err != nil {
		t.Fatalf("Failed to unmarshal UserGoogleInfo: %v", err)
	}

	if userInfo.Email != "unmarshaled@example.com" {
		t.Errorf("Expected email 'unmarshaled@example.com', got '%s'", userInfo.Email)
	}

	if userInfo.Picture != "https://example.com/image.png" {
		t.Errorf("Expected picture 'https://example.com/image.png', got '%s'", userInfo.Picture)
	}
}

func TestUserGoogleInfo_PartialData(t *testing.T) {
	// Test with only email
	userInfo1 := UserGoogleInfo{
		Email: "onlyemail@example.com",
	}

	if userInfo1.Email != "onlyemail@example.com" {
		t.Errorf("Expected email 'onlyemail@example.com', got '%s'", userInfo1.Email)
	}

	if userInfo1.Picture != "" {
		t.Errorf("Expected empty picture, got '%s'", userInfo1.Picture)
	}

	// Test with only picture
	userInfo2 := UserGoogleInfo{
		Picture: "https://example.com/only-picture.jpg",
	}

	if userInfo2.Email != "" {
		t.Errorf("Expected empty email, got '%s'", userInfo2.Email)
	}

	if userInfo2.Picture != "https://example.com/only-picture.jpg" {
		t.Errorf("Expected picture 'https://example.com/only-picture.jpg', got '%s'", userInfo2.Picture)
	}
}

func TestUserGoogleInfo_ValidEmailFormat(t *testing.T) {
	testCases := []struct {
		name  string
		email string
		valid bool
	}{
		{"Valid Gmail", "user@gmail.com", true},
		{"Valid Custom Domain", "user@example.com", true},
		{"Invalid No At", "usergmail.com", false},
		{"Invalid No Domain", "user@", false},
		{"Invalid Empty", "", false},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			userInfo := UserGoogleInfo{Email: tc.email}

			// Basic email validation (contains @)
			hasAt := false
			for _, char := range userInfo.Email {
				if char == '@' {
					hasAt = true
					break
				}
			}

			if tc.valid && !hasAt && tc.email != "" {
				t.Errorf("Expected valid email format for '%s'", tc.email)
			}

			if !tc.valid && hasAt && tc.email != "" {
				// This is fine, we're just checking structure
			}
		})
	}
}

func TestUserGoogleInfo_PictureURLValidation(t *testing.T) {
	testCases := []struct {
		name    string
		picture string
		isHTTPS bool
	}{
		{"HTTPS URL", "https://example.com/pic.jpg", true},
		{"HTTP URL", "http://example.com/pic.jpg", false},
		{"No Protocol", "example.com/pic.jpg", false},
		{"Empty", "", false},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			userInfo := UserGoogleInfo{Picture: tc.picture}

			hasHTTPS := len(userInfo.Picture) >= 8 && userInfo.Picture[:8] == "https://"

			if tc.isHTTPS != hasHTTPS {
				t.Errorf("Expected HTTPS=%v for '%s', got %v", tc.isHTTPS, tc.picture, hasHTTPS)
			}
		})
	}
}

func TestUserGoogleInfo_CopyValues(t *testing.T) {
	original := UserGoogleInfo{
		Email:   "original@example.com",
		Picture: "https://example.com/original.jpg",
	}

	// Copy values
	copied := UserGoogleInfo{
		Email:   original.Email,
		Picture: original.Picture,
	}

	if copied.Email != original.Email {
		t.Error("Copied email should match original")
	}

	if copied.Picture != original.Picture {
		t.Error("Copied picture should match original")
	}

	// Modify copy
	copied.Email = "modified@example.com"

	if copied.Email == original.Email {
		t.Error("Modified copy should not affect original")
	}
}
