// Copyright 2017 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package app

import (
	"encoding/json"
	"net/http"
	"strconv"

	"golang.org/x/perf/storage/benchfmt"
)

func (a *App) search(w http.ResponseWriter, r *http.Request) {
	if err := r.ParseForm(); err != nil {
		http.Error(w, err.Error(), 500)
		return
	}

	q := r.Form.Get("q")
	if q == "" {
		http.Error(w, "missing q parameter", 400)
		return
	}

	query := a.DB.Query(q)
	defer query.Close()

	w.Header().Set("Content-Type", "text/plain; charset=utf-8")
	bw := benchfmt.NewPrinter(w)
	for query.Next() {
		if err := bw.Print(query.Result()); err != nil {
			http.Error(w, err.Error(), 500)
			return
		}
	}
	if err := query.Err(); err != nil {
		http.Error(w, err.Error(), 500)
		return
	}
}

// uploads serves a list of upload IDs on /uploads.
// If the query parameter q is provided, only uploads containing matching records are returned.
// The format of the result is "<count> <uploadid>\n" where count is the number of matching records.
// The lines are sorted in order from most to least recent.
// If the query parameter limit is provided, only the most recent limit upload IDs are returned.
// If limit is not provided, the most recent 1000 upload IDs are returned.
func (a *App) uploads(w http.ResponseWriter, r *http.Request) {
	ctx := requestContext(r)

	if err := r.ParseForm(); err != nil {
		http.Error(w, err.Error(), 500)
		return
	}

	q := r.Form.Get("q")

	limit := 1000
	limitStr := r.Form.Get("limit")
	if limitStr != "" {
		var err error
		limit, err = strconv.Atoi(limitStr)
		if err != nil {
			http.Error(w, "invalid limit parameter", 400)
			return
		}
	}

	res := a.DB.ListUploads(q, r.Form["extra_label"], limit)
	defer res.Close()

	w.Header().Set("Content-Type", "application/json")
	e := json.NewEncoder(w)
	for res.Next() {
		ui := res.Info()
		if err := e.Encode(&ui); err != nil {
			errorf(ctx, "failed to encode JSON: %v", err)
			http.Error(w, err.Error(), 500)
			return
		}
	}
	if err := res.Err(); err != nil {
		http.Error(w, err.Error(), 500)
		return
	}
}
