package client

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

type searchParams struct {
	Grp         int    `json:"grp"`
	NumPerPage  int    `json:"num_per_page"`
	PageNum     int    `json:"page_num"`
	Query       string `json:"query"`
	RemotePlace string `json:"remoteplace"`
	SearchType  int    `json:"search_type"`
	//SearchID    string `json:"searchid"` // todo: it seems generated randomly
}

type searchResponse struct {
	Body struct {
		Song struct {
			List []*TrackInfo `json:"list"`
		} `json:"song"`
	} `json:"body"`
	Code int `json:"code"`
}

func (c *QQMusic) Search(ctx context.Context, keyword string) ([]*TrackInfo, error) {

	resp, err := c.rpcCall(ctx,
		"music.search.SearchCgiService",
		"DoSearchForQQMusicDesktop",
		"music.search.SearchCgiService",
		&searchParams{
			SearchType: 0, Query: keyword,
			PageNum: 1, NumPerPage: 40,

			// static values
			Grp: 1, RemotePlace: "sizer.newclient.song",
		})
	if err != nil {
		return nil, fmt.Errorf("qqMusicClient[Search] rpc call: %w", err)
	}

	respData := searchResponse{}
	if err := json.Unmarshal(resp, &respData); err != nil {
		return nil, fmt.Errorf("qqMusicClient[Search] unmarshal response: %w", err)
	}

	return respData.Body.Song.List, nil

}