package main

import (
	"encoding/json"
	"fmt"
	"time"
)

func tryOtherNodesForVideoSearch(query, safe, lang string, page int, visitedNodes []string) []VideoResult {
	for _, nodeAddr := range peers {
		if contains(visitedNodes, nodeAddr) {
			continue // Skip nodes already visited
		}
		results, err := sendVideoSearchRequestToNode(nodeAddr, query, safe, lang, page, visitedNodes)
		if err != nil {
			printWarn("Error contacting node %s: %v", nodeAddr, err)
			continue
		}
		if len(results) > 0 {
			return results
		}
	}
	return nil
}

func sendVideoSearchRequestToNode(nodeAddr, query, safe, lang string, page int, visitedNodes []string) ([]VideoResult, error) {
	visitedNodes = append(visitedNodes, nodeAddr)
	searchParams := struct {
		Query        string   `json:"query"`
		Safe         string   `json:"safe"`
		Lang         string   `json:"lang"`
		Page         int      `json:"page"`
		ResponseAddr string   `json:"responseAddr"`
		VisitedNodes []string `json:"visitedNodes"`
	}{
		Query:        query,
		Safe:         safe,
		Lang:         lang,
		Page:         page,
		ResponseAddr: fmt.Sprintf("http://localhost:%d/node", config.Port),
		VisitedNodes: visitedNodes,
	}

	msgBytes, err := json.Marshal(searchParams)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal search parameters: %v", err)
	}

	msg := Message{
		ID:      hostID,
		Type:    "search-video",
		Content: string(msgBytes),
	}

	err = sendMessage(nodeAddr, msg)
	if err != nil {
		return nil, fmt.Errorf("failed to send search request to node %s: %v", nodeAddr, err)
	}

	// Wait for results
	select {
	case res := <-videoResultsChan:
		return res, nil
	case <-time.After(20 * time.Second):
		return nil, fmt.Errorf("timeout waiting for results from node %s", nodeAddr)
	}
}

func handleVideoResultsMessage(msg Message) {
	var results []VideoResult
	err := json.Unmarshal([]byte(msg.Content), &results)
	if err != nil {
		printWarn("Error unmarshalling video results: %v", err)
		return
	}

	printDebug("Received video results: %+v", results)
	// Send results to videoResultsChan
	go func() {
		videoResultsChan <- results
	}()
}