package main

import (
	"flag"
	"log"
	"strconv"

	"github.com/coreos/go-etcd/etcd"
)

func write(requests int, end chan int) {
	client := etcd.NewClient(nil)

	for i := 0; i < requests; i++ {
		key := strconv.Itoa(i)
		client.Set(key, key, 0)
	}
	end <- 1
}

func watch(key string) {
	client := etcd.NewClient(nil)

	receiver := make(chan *etcd.Response)
	go client.Watch(key, 0, true, receiver, nil)

	log.Printf("watching: %s", key)

	received := 0
	for {
		<-receiver
		received++
	}
}

func main() {
	rWrites := flag.Int("write-requests", 50000, "number of writes")
	cWrites := flag.Int("concurrent-writes", 500, "number of concurrent writes")

	watches := flag.Int("watches", 500, "number of writes")

	flag.Parse()

	for i := 0; i < *watches; i++ {
		key := strconv.Itoa(i)
		go watch(key)
	}

	wChan := make(chan int, *cWrites)
	for i := 0; i < *cWrites; i++ {
		go write((*rWrites / *cWrites), wChan)
	}

	for i := 0; i < *cWrites; i++ {
		<-wChan
		log.Printf("Completed %d writes", (*rWrites / *cWrites))
	}
}