package main

import (
	"fmt"
	"html/template"
	"log"
	"net/http"
	"net/url"
	"strings"
	"time"

	"github.com/PuerkitoBio/goquery"
)

type TextSearchResult struct {
	URL         string
	Header      string
	Description string
}

func PerformTextSearch(query, safe, lang string) ([]TextSearchResult, error) {
	var results []TextSearchResult

	client := &http.Client{}
	safeParam := "&safe=off"
	if safe == "active" {
		safeParam = "&safe=active"
	}

	langParam := ""
	if lang != "" {
		langParam = "&lr=" + lang
	}

	searchURL := "https://www.google.com/search?q=" + url.QueryEscape(query) + safeParam + langParam

	req, err := http.NewRequest("GET", searchURL, nil)
	if err != nil {
		log.Fatalf("Failed to create request: %v", err)
	}

	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36")

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}
	defer resp.Body.Close()

	doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		return nil, err
	}

	doc.Find(".yuRUbf").Each(func(i int, s *goquery.Selection) {
		link := s.Find("a")
		href, _ := link.Attr("href")
		header := link.Find("h3").Text()
		header = strings.TrimSpace(strings.TrimSuffix(header, "›"))

		descSelection := doc.Find(".VwiC3b").Eq(i)
		description := ""
		if descSelection.Length() > 0 {
			description = descSelection.Text()
		}

		results = append(results, TextSearchResult{
			URL:         href,
			Header:      header,
			Description: description,
		})
	})

	return results, nil
}

func handleTextSearch(w http.ResponseWriter, query, safe, lang string) {
	// Perform the text search
	results, err := PerformTextSearch(query, safe, lang)
	if err != nil {
		log.Printf("Error performing text search: %v", err)
		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
		return
	}

	// Assuming you have a separate template for text search results
	tmpl, err := template.ParseFiles("templates/results.html") // Ensure this path matches your templates' location
	if err != nil {
		log.Printf("Error parsing template: %v", err)
		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
		return
	}

	data := struct {
		Results         []TextSearchResult // Ensure this type matches the structure expected by your template
		Query           string
		Fetched         string
		LanguageOptions []LanguageOption
		CurrentLang     string
	}{
		Results:         results,
		Query:           query,
		Fetched:         fmt.Sprintf("%.2f seconds", time.Since(time.Now()).Seconds()), // Example fetched time, adjust as necessary
		LanguageOptions: languageOptions,                                               // Assuming this is defined globally or elsewhere
		CurrentLang:     lang,
	}

	err = tmpl.Execute(w, data)
	if err != nil {
		log.Printf("Error executing template: %v", err)
		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
	}
}