package weed_server

import (
	"code.google.com/p/weed-fs/go/glog"
	"code.google.com/p/weed-fs/go/replication"
	"code.google.com/p/weed-fs/go/sequence"
	"code.google.com/p/weed-fs/go/topology"
	"github.com/gorilla/mux"
	"path"
	"sync"
)

type MasterServer struct {
	port              int
	metaFolder        string
	volumeSizeLimitMB uint
	pulseSeconds      int
	defaultRepType    string
	garbageThreshold  string
	whiteList         []string
	version           string

	topo   *topology.Topology
	vg     *replication.VolumeGrowth
	vgLock sync.Mutex
}

func NewMasterServer(r *mux.Router, version string, port int, metaFolder string,
	volumeSizeLimitMB uint,
	pulseSeconds int,
	confFile string,
	defaultRepType string,
	garbageThreshold string,
	whiteList []string) *MasterServer {
	ms := &MasterServer{
		version:           version,
		volumeSizeLimitMB: volumeSizeLimitMB,
		pulseSeconds:      pulseSeconds,
		defaultRepType:    defaultRepType,
		garbageThreshold:  garbageThreshold,
		whiteList:         whiteList,
	}
	//if len(*etcdCluster) == 0 {
	seq := sequence.NewFileSequencer(path.Join(metaFolder, "weed.seq"))
	//} else {
	//	seq = sequence.NewEtcdSequencer(*etcdCluster)
	//}
	var e error
	if ms.topo, e = topology.NewTopology("topo", confFile, seq,
		uint64(volumeSizeLimitMB)*1024*1024, pulseSeconds); e != nil {
		glog.Fatalf("cannot create topology:%s", e)
	}
	ms.vg = replication.NewDefaultVolumeGrowth()
	glog.V(0).Infoln("Volume Size Limit is", volumeSizeLimitMB, "MB")

	r.HandleFunc("/dir/assign", secure(ms.whiteList, ms.dirAssignHandler))
	r.HandleFunc("/dir/lookup", secure(ms.whiteList, ms.dirLookupHandler))
	r.HandleFunc("/dir/join", secure(ms.whiteList, ms.dirJoinHandler))
	r.HandleFunc("/dir/status", secure(ms.whiteList, ms.dirStatusHandler))
	r.HandleFunc("/vol/grow", secure(ms.whiteList, ms.volumeGrowHandler))
	r.HandleFunc("/vol/status", secure(ms.whiteList, ms.volumeStatusHandler))
	r.HandleFunc("/vol/vacuum", secure(ms.whiteList, ms.volumeVacuumHandler))
	r.HandleFunc("/submit", secure(ms.whiteList, ms.submitFromMasterServerHandler))
	r.HandleFunc("/", ms.redirectHandler)

	ms.topo.StartRefreshWritableVolumes(garbageThreshold)

	return ms
}