package api

import (
	"github.com/gorilla/mux"
	"github.com/pingcap/wormhole/ether"
	"github.com/unrolled/render"
)

func createRouter(prefix string, svr *ether.Server) *mux.Router {
	rd := render.New(render.Options{
		IndentJSON: true,
	})

	router := mux.NewRouter().PathPrefix(prefix).Subrouter()
	handler := svr.GetHandler()

	workerHandler := newWorkerHandler(handler, rd)
	router.HandleFunc("/api/v1/workers", workerHandler.List).Methods("GET")
	router.HandleFunc("/api/v1/portals", workerHandler.ListPortals).Methods("GET")
	router.HandleFunc("/api/v1/stargates", workerHandler.ListStargates).Methods("GET")
	router.HandleFunc("/api/v1/workers/{worker_id}", workerHandler.Get).Methods("GET")

	jobHandler := newJobHandler(handler, rd)
	router.HandleFunc("/api/v1/datasources", jobHandler.CreateDataSource).Methods("POST")
	router.HandleFunc("/api/v1/datasources", jobHandler.GetDataSources).Methods("GET")
	router.HandleFunc("/api/v1/datasources/{id}", jobHandler.GetDataSource).Methods("GET")
	router.HandleFunc("/api/v1/datasources/{id}", jobHandler.DeleteDatasource).Methods("DELETE")

	router.HandleFunc("/api/v1/pipelines", jobHandler.CreatePipeline).Methods("POST")
	router.HandleFunc("/api/v1/pipelines", jobHandler.GetPipelines).Methods("GET")
	router.HandleFunc("/api/v1/pipelines/{id}", jobHandler.DeletePipeline).Methods("DELETE")
	router.HandleFunc("/api/v1/pipelines/{id}", jobHandler.GetPipeline).Methods("GET")
	router.HandleFunc("/api/v1/pipelines/{id}/summary", jobHandler.GetPipelineSummary).Methods("GET")
	router.HandleFunc("/api/v1/pipelines/{id}/detail", jobHandler.GetPipelineDetail).Methods("GET")

	// FIXME still used?
	router.HandleFunc("/api/v1/jobs/status/{ids}", jobHandler.GetJobStatus).Methods("GET")
	router.HandleFunc("/api/v1/jobs/{id}", jobHandler.Delete).Methods("DELETE")
	router.HandleFunc("/api/v1/jobs/{id}/{action}", jobHandler.Action).Methods("PUT")
	router.HandleFunc("/api/v1/jobs/replicate/{id}/{replicate}", jobHandler.Replicate).Methods("PUT")
	router.HandleFunc("/api/v1/schemainfos/{host}/{port}", jobHandler.SchemaInfo).Methods("GET")
	router.HandleFunc("/api/v1/resources/{id}/{type}", jobHandler.GetResource).Methods("GET")

	return router
}
