package itcronjob

import (
	"net/http"

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

	"github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/aws"
	"github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/bill"
	cloud_billing "github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/cloud-billing"
	full_projects "github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/full-projects"
	org_order "github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/org-order"
	"github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/controller/s3"
	"github.com/pingcap-inc/data-ingestion-tools/internal/itcronjob/store/mysql"
	"github.com/pingcap-inc/data-ingestion-tools/internal/pkg/code"
	"github.com/pingcap-inc/data-ingestion-tools/internal/pkg/middleware"
	"github.com/pingcap-inc/data-ingestion-tools/pkg/errors"
	"github.com/pingcap-inc/data-ingestion-tools/pkg/util/ginres"
)

func initRouter(g *gin.Engine) {
	installController(g)
}

func installController(g *gin.Engine) *gin.Engine {
	g.NoRoute(func(c *gin.Context) {
		// with url
		ginres.WriteResponse(c, errors.WithCode(code.ErrNotFound, "Not found."+c.Request.URL.Path), nil)
	})

	store, _ := mysql.GetMySQLFactoryOr(nil)
	authRoute := g.Group("", middleware.Auth())
	s3Group := authRoute.Group("/s3")
	{
		s3Controller := s3.NewS3Controller(store)
		s3Group.POST("/fetch", s3Controller.TransS3Bq)
	}
	billGroup := authRoute.Group("/bill")
	{
		billController := bill.NewBillController(store)
		billGroup.POST("/fetch", billController.Fetch)
	}
	awsGroup := authRoute.Group("/aws")
	{
		awsController := aws.NewAwsController(store)
		awsGroup.POST("/fetch", awsController.Fetch)
	}
	fullController := full_projects.NewFllController(store)
	authRoute.POST("/full-projects", fullController.SyncFullProjects)

	orgOrderController := org_order.NewOrgOrderController(store)
	authRoute.POST("/org-order", orgOrderController.Fetch)
	authRoute.POST("/salesforce", orgOrderController.SyncSalesforce)
	authRoute.POST("/fixup", orgOrderController.FixUp)

	billingRroup := g.Group("/")
	billingRroup.Use(
		sessions.Sessions("cloud_billing_session", cookie.NewStore([]byte("gXEj6MW9O0vaFMCGA6nlGPviQTmmtEWr"))),
		middleware.Authorize,
	)
	{
		billingRroup.GET("/account/login", middleware.Login)
		billingRroup.GET("/account/callback", middleware.Callback)
		billingRroup.GET("/account/logout", middleware.Logout)
		billingRroup.GET("/account/profile", middleware.Profile)

		billingRroup.GET("/get_user_info", middleware.GetUserInfo)

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

		billingRroup.StaticFS("/pages", http.Dir("./web/pages"))
		billingRroup.GET("/", func(ctx *gin.Context) {
			ctx.File("web")
		})

		cloudBillingController := cloud_billing.NewCloudBillingController(store)
		billingRroup.POST("/upload", cloudBillingController.Upload)
		billingRroup.GET("/download", cloudBillingController.Download)
		billingRroup.GET("/list", cloudBillingController.GetCloudBillingList)
	}

	return g
}
