/*
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 (
	"encoding/json"
	"flag"
	"fmt"
	"io"
	"net/http"
	"strings"

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

var (
	dryRun = flag.Bool("dryrun", false, "write Gerrit reviews to stdout instead of posting them")
)

// Comment represents a single inline file comment.
type Comment struct {
	Line    int    `json:"line,omitempty"`
	Message string `json:"message,omitempty"`
}

// Labels represents the Code-Review and Verified labels associated with a review.
type Labels struct {
	CodeReview int `json:"Code-Review,omitempty"`
	Verified   int `json:"Verified,omitempty"`
}

// Review represents a complete Gerrit review post.
type Review struct {
	Message  string               `json:"message,omitempty"`
	Labels   *Labels              `json:"labels,omitempty"`
	Comments map[string][]Comment `json:"comments,omitempty"`
}

// Post publishes a review to a Gerrit review thread.
// If the -dryrun flag is set to true, then it instead prints the review to stdout.
func Post(ref string, review Review) error {
	if *dryRun {
		fmt.Printf("Review for %s:\n%#v\n", ref, review)
		return nil
	}

	// ref is of the form "refs/changes/34/1234/7"; we want "1234" and "7".
	path := strings.Split(ref, "/")
	changeID, revisionID := path[3], path[4]
	url := fmt.Sprintf("https://gwt-review.googlesource.com/a/changes/%s/revisions/%s/review", changeID, revisionID)

	pr, pw := io.Pipe()
	go func() {
		pw.CloseWithError(json.NewEncoder(pw).Encode(review))
	}()
	req, err := http.NewRequest("POST", url, pr)
	if err != nil {
		return err
	}

	req.Header.Add("Content-Type", "application/json;charset=UTF-8")
	req.SetBasicAuth(creds.GerritBasicAuth())

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