package router

import "github.com/gorilla/mux"

func API() *mux.Router {
	m := mux.NewRouter()

	// Users
	m.Path("/users").Methods("GET").Name(Users)
	m.Path("/users").Methods("POST").Name(CreateUser)
	m.Path("/users/{Id:.+}").Methods("GET").Name(User)
	m.Path("/authenticate").Methods("POST").Name(GetToken)

	// Genera
	m.Path("/genera").Methods("GET").Name(Genera)
	m.Path("/genera").Methods("POST").Name(CreateGenus)
	m.Path("/genera/{Id:.+}").Methods("GET").Name(Genus)
	m.Path("/genera/{Id:.+}").Methods("PUT").Name(UpdateGenus)
	m.Path("/genera/{Id:.+}").Methods("DELETE").Name(DeleteGenus)

	// Species
	m.Path("/species").Methods("GET").Name(SpeciesList)
	m.Path("/species").Methods("POST").Name(CreateSpecies)
	m.Path("/species/{Id:.+}").Methods("GET").Name(Species)
	m.Path("/species/{Id:.+}").Methods("PUT").Name(UpdateSpecies)
	m.Path("/species/{Id:.+}").Methods("DELETE").Name(DeleteSpecies)

	// Strains
	m.Path("/strains").Methods("GET").Name(Strains)
	m.Path("/strains").Methods("POST").Name(CreateStrain)
	m.Path("/strains/{Id:.+}").Methods("GET").Name(Strain)
	m.Path("/strains/{Id:.+}").Methods("PUT").Name(UpdateStrain)
	m.Path("/strains/{Id:.+}").Methods("DELETE").Name(DeleteStrain)

	// CharacteristicTypes
	m.Path("/characteristic_types").Methods("GET").Name(CharacteristicTypes)
	m.Path("/characteristic_types").Methods("POST").Name(CreateCharacteristicType)
	m.Path("/characteristic_types/{Id:.+}").Methods("GET").Name(CharacteristicType)
	m.Path("/characteristic_types/{Id:.+}").Methods("PUT").Name(UpdateCharacteristicType)
	m.Path("/characteristic_types/{Id:.+}").Methods("DELETE").Name(DeleteCharacteristicType)

	// Characteristics
	m.Path("/characteristics").Methods("GET").Name(Characteristics)
	m.Path("/characteristics").Methods("POST").Name(CreateCharacteristic)
	m.Path("/characteristics/{Id:.+}").Methods("GET").Name(Characteristic)
	m.Path("/characteristics/{Id:.+}").Methods("PUT").Name(UpdateCharacteristic)
	m.Path("/characteristics/{Id:.+}").Methods("DELETE").Name(DeleteCharacteristic)

	// TextMeasurementTypes
	m.Path("/text_measurement_types").Methods("GET").Name(TextMeasurementTypes)
	m.Path("/text_measurement_types").Methods("POST").Name(CreateTextMeasurementType)
	m.Path("/text_measurement_types/{Id:.+}").Methods("GET").Name(TextMeasurementType)
	m.Path("/text_measurement_types/{Id:.+}").Methods("PUT").Name(UpdateTextMeasurementType)
	m.Path("/text_measurement_types/{Id:.+}").Methods("DELETE").Name(DeleteTextMeasurementType)

	// UnitTypes
	m.Path("/unit_types").Methods("GET").Name(UnitTypes)
	m.Path("/unit_types").Methods("POST").Name(CreateUnitType)
	m.Path("/unit_types/{Id:.+}").Methods("GET").Name(UnitType)
	m.Path("/unit_types/{Id:.+}").Methods("PUT").Name(UpdateUnitType)
	m.Path("/unit_types/{Id:.+}").Methods("DELETE").Name(DeleteUnitType)

	// Measurements
	m.Path("/measurements").Methods("GET").Name(Measurements)
	m.Path("/measurements").Methods("POST").Name(CreateMeasurement)
	m.Path("/measurements/{Id:.+}").Methods("GET").Name(Measurement)
	m.Path("/measurements/{Id:.+}").Methods("PUT").Name(UpdateMeasurement)
	m.Path("/measurements/{Id:.+}").Methods("DELETE").Name(DeleteMeasurement)

	// Subrouter for auth/security
	s := m.PathPrefix("/{genus}").Subrouter()
	s.Path("/species").Methods("GET").Name(SubrouterListSpecies)
	s.Path("/strains").Methods("GET").Name(SubrouterListStrains)
	s.Path("/measurements").Methods("GET").Name(SubrouterListMeasurements)

	// Misc
	m.Path("/health").Methods("GET").Name(Health)

	return m
}