package ytsclient

import (
	r "github.com/levigross/grequests"
	"strconv"
)

type Client struct {
	url         string
	list        string
	get         string
	suggestions string
}

const (
	list        = "/list_movies.json"
	get         = "/movie_details.json"
	suggestions = "/movie_suggestions.json"
)

func NewClient(url string) *Client {
	if url == "" {
		url = "https://yts.am/api/v2"
	}
	return &Client{url, url + list, url + get, url + suggestions}
}

func (y *Client) List(params *ListParams) ([]Movie, error) {
	if params == nil {
		params = &ListParams{}
	}
	res, err := r.Get(y.list, params.format())
	if err != nil {
		return nil, err
	}
	var resp ListResponse
	if err := res.JSON(&resp); err != nil {
		return nil, err
	}
	return resp.Data.Movies, nil
}

func (y *Client) Search(search string, params *ListParams) ([]Movie, error) {
	if params == nil {
		params = &ListParams{}
	}
	params.QueryTerm = search
	res, err := r.Get(y.list, params.format())
	if err != nil {
		return nil, err
	}
	var resp ListResponse
	if err := res.JSON(&resp); err != nil {
		return nil, err
	}
	return resp.Data.Movies, nil
}

func (y *Client) Get(id string, params *MovieParams) (Movie, error) {
	if params == nil {
		params = &MovieParams{}
	}
	p := params.format()
	p.Params["movie_id"] = id
	res, err := r.Get(y.get, p)
	if err != nil {
		return Movie{}, err
	}
	var resp MovieResponse
	if err := res.JSON(&resp); err != nil {
		return Movie{}, err
	}
	return resp.Data.Movie, nil
}

func (y *Client) Suggestions(id int) ([]Movie, error) {
	ro := &r.RequestOptions{
		Params: map[string]string{"movie_id": strconv.Itoa(id)},
	}
	res, err := r.Get(y.suggestions, ro)
	if err != nil {
		return nil, err
	}
	var resp ListResponse
	if err := res.JSON(&resp); err != nil {
		return nil, err
	}
	return resp.Data.Movies, nil
}
