package workload

import (
	"context"
	"encoding/json"
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/pov-service/pkg/browser"
)

func TestDownloadPDF(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping test in short mode.")
	}
	localStorageJSON := "..."
	localStorageMap := make(map[string]string)
	err := json.Unmarshal([]byte(localStorageJSON), &localStorageMap)
	assert.Nil(t, err)
	localStorages := make([]browser.LocalStorage, 0)
	for k, v := range localStorageMap {
		localStorages = append(localStorages, browser.LocalStorage{
			Key:   k,
			Value: v,
		})
	}
	ctx := browser.NewLocalStorageContext(context.Background(), localStorages)

	allocator, cancel := browser.NewHeadlessAllocator(ctx)
	defer cancel()

	if err := browser.Navigate(
		ctx,
		"https://feat-pov--staging-tidbcloud.netlify.app/console/web-terminal"); err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	pdfBytes, err := browser.PrintPDF(allocator.Context,
		browser.PrintPDFOptions{
			Address:       "https://feat-pov--staging-tidbcloud.netlify.app/pov/workload/c176bb7a-7119-4dcb-99f8-6f3108b6aba8",
			ReadySelector: "//*[normalize-space()='Configuration']",
		})
	assert.Nil(t, err)

	err = os.WriteFile("test.pdf", pdfBytes, 0644)

	assert.Nil(t, err)
}

func TestDownloadTestPDF(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping test in short mode.")
	}
	// Create mock service implementation
	svc := &svcImpl{}

	// Test ID (can be any string for this test)
	testID := "c176bb7a-7119-4dcb-99f8-6f3108b6aba8"

	// Prepare localStorage data
	localStorageJSON := ""
	localStorageMap := make(map[string]string)
	err := json.Unmarshal([]byte(localStorageJSON), &localStorageMap)
	assert.Nil(t, err)

	localStorages := make([]browser.LocalStorage, 0)
	for k, v := range localStorageMap {
		localStorages = append(localStorages, browser.LocalStorage{
			Key:   k,
			Value: v,
		})
	}
	ctx := browser.NewLocalStorageContext(context.Background(), localStorages)

	// PDF options
	pdfOpts := browser.PrintPDFOptions{
		Address:       "https://feat-pov--staging-tidbcloud.netlify.app/pov/workload/c176bb7a-7119-4dcb-99f8-6f3108b6aba8",
		ReadySelector: "//*[normalize-space()='Configuration']",
		Width:         11.0,
		Height:        8.5,
	}

	// Call DownloadTestPDF
	file, err := svc.DownloadTestPDF(ctx, testID, pdfOpts)
	assert.Nil(t, err)
	assert.NotNil(t, file)

	defer func() {
		file.Close()
		os.Remove(file.Name())
	}()

	// Verify the file exists and has content
	fileInfo, err := file.Stat()
	assert.Nil(t, err)
	assert.Greater(t, fileInfo.Size(), int64(0), "PDF file should have content")

	// Verify it's a valid PDF by checking the header
	buffer := make([]byte, 4)
	_, err = file.ReadAt(buffer, 0)
	assert.Nil(t, err)
	assert.Equal(t, "%PDF", string(buffer), "File should start with PDF header")

	// Also save a copy for manual verification (optional)
	err = os.WriteFile("test_download.pdf", func() []byte {
		file.Seek(0, 0)
		content, _ := os.ReadFile(file.Name())
		return content
	}(), 0644)
	assert.Nil(t, err)
}
