package routers

import (
	"cmdb-backend/middleware"
	v1 "cmdb-backend/routers/api/v1"
	"net/http"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

// HandleTableAndDesc 用与 handle 函数与 表名及其业务描述的映射
type HandleTableAndDesc map[string]string // value 值填入 {最直接关联的唯一表名},{业务描述}

var HandleTableName = HandleTableAndDesc{
	"CreateDomain":      "domain,创建域名",
	"UpdateDomain":      "domain,更新域名",
	"DeleteDomain":      "domain,删除域名",
	"CreateDnsRecord":   "dns_record,创建 DNS 解析",
	"UpdateDnsRecord":   "dns_record,更新 DNS 解析",
	"DeleteDnsRecord":   "dns_record,删除 DNS 解析",
	"DisableDnsRecord":  "dns_record,禁用 DNS 解析",
	"EnableDnsRecord":   "dns_record,启用 DNS 解析",
	"MaintenanceServer": "server,下工单",
	"UpdateServer":      "server,更新服务器信息",
	"StartServer":       "server,开启服务器",
	"StopServer":        "server,关闭服务器",
	"ReBootServer":      "server,重启服务器",
	"DeleteServer":      "server,删除服务器",
	"CreateServer":      "server,创建服务器",
	"ReInstallServer":   "server,重装服务器",
}

func InitRouter() *gin.Engine {
	router := gin.Default()
	router.Use(
		gin.Logger(),
		gin.Recovery(),
		sessions.Sessions("cmdb_session", cookie.NewStore([]byte("JgUQPTwfPH95YN6G826G6rAG"))),
		middleware.Authorize,
		middleware.Operation(HandleTableName),
	)

	/* auth api */
	router.GET("/api/account/login", middleware.Login)
	router.GET("/api/account/callback", middleware.Callback)
	router.GET("/api/account/logout", middleware.Logout)
	router.GET("/api/account/profile", middleware.Profile)

	router.GET("/check_health", func(ctx *gin.Context) {
		ctx.JSON(http.StatusOK, gin.H{"result": "ok!"})
	})

	/* frontend api */
	router.GET("/api/get_user_info", v1.GetUserInfo)
	router.StaticFS("/pages", http.Dir("./web/pages"))
	router.GET("/", func(ctx *gin.Context) {
		ctx.File("web")
	})

	apiV1 := router.Group("/api/v1")
	{
		/* common api */
		apiV1.GET("/user/list", v1.GetUserList)
		apiV1.GET("/user/superusers", v1.GetSuperuserList)
		apiV1.GET("/app/list", v1.GetAppList)
		apiV1.GET("/zone/list", v1.GetZoneList)
		apiV1.GET("/region/list", v1.GetRegionList)
		apiV1.GET("/project/list", v1.GetProjectList)
		apiV1.GET("/operator/log", v1.GetOperatorLog)
		apiV1.GET("/servers/get_image", v1.GetServerImageList)

		/*vendor api*/
		apiV1.GET("/vendors", v1.GetVendorRecord)
		apiV1.POST("/vendors", v1.CreateVendorRecord)
		apiV1.PATCH("/vendors/:vendor_name", v1.UpdateVendorRecord)
		apiV1.DELETE("/vendors/:vendor_name", v1.DeleteVendorRecord)

		/*LB api*/
		apiV1.GET("/lb", v1.GetLBList)
		apiV1.POST("/lb", v1.CreateLB)
		apiV1.PATCH("/lb/:lb_name", v1.UpdateLB)
		apiV1.DELETE("/lb/:lb_name", v1.DeleteLB)

		/* domain api */
		apiV1.GET("/domains", v1.GetDomainList)
		apiV1.POST("/domains", v1.CreateDomain)
		apiV1.PATCH("/domains/:domain_name", v1.UpdateDomain)
		apiV1.DELETE("/domains/:domain_name", v1.DeleteDomain)

		/* app api */
		apiV1.POST("/apps", v1.CreateApp)
		apiV1.GET("/apps", v1.GetAppInfoList)
		apiV1.PATCH("/apps/:app_name", v1.UpdateApp)
		apiV1.DELETE("/apps/:app_name", v1.DeleteApp)
		apiV1.GET("apps/:app_name/resources", v1.GetAppResourceList)

		/* dns api */
		apiV1.GET("/zones", v1.GetDnsZoneList)
		apiV1.GET("/dns_type", v1.GetDnsTypeList)
		apiV1.GET("/zones/:zone_name/records", v1.GetDnsRecord)
		apiV1.POST("/zones/:zone_name/records", v1.CreateDnsRecord)
		apiV1.PATCH("/zones/:zone_name/records/:record_name", v1.UpdateDnsRecord)
		apiV1.DELETE("/zones/:zone_name/records/:record_name", v1.DeleteDnsRecord)
		apiV1.PATCH("/zones/:zone_name/records/:record_name/disable", v1.DisableDnsRecord)
		apiV1.PATCH("/zones/:zone_name/records/:record_name/enable", v1.EnableDnsRecord)

		/* server api */
		apiV1.GET("/servers", v1.GetServerList)
		apiV1.GET("/servers/:id", v1.GetServerDetail)
		apiV1.POST("/servers/create", v1.CreateServer)
		apiV1.PATCH("/servers/update", v1.UpdateServer)
		apiV1.DELETE("/servers/delete", v1.DeleteServer)
		apiV1.POST("/servers/start", v1.StartServer)
		apiV1.POST("/servers/stop", v1.StopServer)
		apiV1.POST("/servers/reboot", v1.ReBootServer)
		apiV1.POST("/servers/reinstall", v1.ReInstallServer)
		apiV1.POST("/servers/maintenance", v1.MaintenanceServer)

		/* s3 api */
		apiV1.GET("/oss", v1.GetBucketList)
		apiV1.POST("/oss", v1.CreateBucketRecord)

		/* cdn api */
		apiV1.GET("/cdn", v1.GetCdnList)
	}

	return router
}
