/*
Copyright 2013 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

package gerrit

import (
	"bufio"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"

	"gwt.googlesource.com/buildglue.git/creds"
)

// Return a list of git references matched by the Gerrit search query q.
//
// See https://gerrit-review.googlesource.com/Documentation/user-search.html
// for documentation about Gerrit search syntax.
func Query(q string) ([]string, error) {
	url := fmt.Sprintf("https://gwt-review.googlesource.com/a/changes/?o=CURRENT_REVISION&q=%s", url.QueryEscape(q))
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}
	req.Header.Add("Accept", "application/json")
	req.SetBasicAuth(creds.GerritBasicAuth())

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		return nil, err
	}
	defer res.Body.Close()

	return ParseRefs(res.Body)
}

// ParseRefs reads a list of Gerrit ChangeInfo entries from reader and returns
// the refs for the current revisions.
func ParseRefs(reader io.Reader) ([]string, error) {
	r := bufio.NewReader(reader)

	// First line of input is the XSSI guard (")]}'").
	if _, err := r.ReadSlice('\n'); err != nil {
		return nil, err
	}

	var changes []struct {
		Current_revision string
		Revisions        map[string]struct {
			Fetch struct {
				Http struct {
					Ref string
				}
			}
		}
	}
	if err := json.NewDecoder(r).Decode(&changes); err != nil {
		return nil, err
	}

	var res []string
	for _, change := range changes {
		res = append(res, change.Revisions[change.Current_revision].Fetch.Http.Ref)
	}
	return res, nil
}
