// music-bandcamp.go - Bandcamp specific implementation
package main

import (
	"fmt"
	"net/http"
	"net/url"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

func SearchBandcamp(query string, page int) ([]MusicResult, error) {
	baseURL := "https://bandcamp.com/search?"
	params := url.Values{
		"q":    []string{query},
		"page": []string{fmt.Sprintf("%d", page)},
	}

	resp, err := http.Get(baseURL + params.Encode())
	if err != nil {
		return nil, fmt.Errorf("request failed: %v", err)
	}
	defer resp.Body.Close()

	doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		return nil, fmt.Errorf("failed to parse HTML: %v", err)
	}

	var results []MusicResult

	doc.Find("li.searchresult").Each(func(i int, s *goquery.Selection) {
		// Extract the item type
		itemType := strings.ToLower(strings.TrimSpace(s.Find("div.itemtype").Text()))

		// Skip if the item is not an album or track
		if itemType != "album" && itemType != "track" {
			return
		}

		result := MusicResult{Source: "Bandcamp"}

		// URL extraction
		if urlSel := s.Find("div.itemurl a"); urlSel.Length() > 0 {
			result.URL = strings.TrimSpace(urlSel.Text())
		}

		// Title extraction
		if titleSel := s.Find("div.heading a"); titleSel.Length() > 0 {
			result.Title = strings.TrimSpace(titleSel.Text())
		}

		// Artist extraction
		if artistSel := s.Find("div.subhead"); artistSel.Length() > 0 {
			result.Artist = strings.TrimSpace(artistSel.Text())
		}

		// Thumbnail extraction
		if thumbSel := s.Find("div.art img"); thumbSel.Length() > 0 {
			result.Thumbnail, _ = thumbSel.Attr("src")
		}

		// // Iframe URL construction
		// if linkHref, exists := s.Find("div.itemurl a").Attr("href"); exists {
		// 	if itemID := extractSearchItemID(linkHref); itemID != "" {
		// 		itemType := strings.ToLower(strings.TrimSpace(s.Find("div.itemtype").Text()))
		// 		result.IframeSrc = fmt.Sprintf(
		// 			"https://bandcamp.com/EmbeddedPlayer/%s=%s/size=large/bgcol=000/linkcol=fff/artwork=small",
		// 			itemType,
		// 			itemID,
		// 		)
		// 	}
		// }

		results = append(results, result)
	})

	return results, nil
}