package main

import (
	"bytes"
	"encoding/base64"
	"encoding/binary"
	"fmt"
	"http"
	"os"
	"regexp"
)

// getHighWater returns the current highwater revision hash for this builder
func (b *Builder) getHighWater() (rev string, err os.Error) {
	url := fmt.Sprintf("http://%s/hw-get?builder=%s", *dashboard, b.name)
	r, _, err := http.Get(url)
	if err != nil {
		return
	}
	buf := new(bytes.Buffer)
	_, err = buf.ReadFrom(r.Body)
	if err != nil {
		return
	}
	r.Body.Close()
	return buf.String(), nil
}

// recordResult sends build results to the dashboard
func (b *Builder) recordResult(buildLog string, c Commit) os.Error {
	return httpCommand("build", map[string]string{
		"builder": b.name,
		"key":     b.key,
		"node":    c.node,
		"parent":  c.parent,
		"user":    c.user,
		"date":    c.date,
		"desc":    c.desc,
		"log":     buildLog,
	})
}

// match lines like: "package.BechmarkFunc	100000	    999 ns/op"
var benchmarkRegexp = regexp.MustCompile("([^\n\t ]+)[\t ]+([0-9]+)[\t ]+([0-9]+) ns/op")

// recordBenchmarks sends benchmark results to the dashboard
func (b *Builder) recordBenchmarks(benchLog string, c Commit) os.Error {
	results := benchmarkRegexp.FindAllStringSubmatch(benchLog, -1)
	var buf bytes.Buffer
	b64 := base64.NewEncoder(base64.StdEncoding, &buf)
	for _, r := range results {
		for _, s := range r[1:] {
			binary.Write(b64, binary.BigEndian, uint16(len(s)))
			b64.Write([]byte(s))
		}
	}
	b64.Close()
	return httpCommand("benchmarks", map[string]string{
		"builder":       b.name,
		"key":           b.key,
		"node":          c.node,
		"benchmarkdata": buf.String(),
	})
}

func httpCommand(cmd string, args map[string]string) os.Error {
	url := fmt.Sprintf("http://%v/%v", *dashboard, cmd)
	_, err := http.PostForm(url, args)
	return err
}
