package alert_server

import (
	"github.com/gin-gonic/gin"

	contractScan "github.com/pingcap-inc/security/internal/alert-server/controller/v1/company"
	docCheck "github.com/pingcap-inc/security/internal/alert-server/controller/v1/doc-check"
	downloadAlert "github.com/pingcap-inc/security/internal/alert-server/controller/v1/download-alert"
	externalUser "github.com/pingcap-inc/security/internal/alert-server/controller/v1/external-user"
	feilianAlert "github.com/pingcap-inc/security/internal/alert-server/controller/v1/feilian-alert"
	gmailLock "github.com/pingcap-inc/security/internal/alert-server/controller/v1/gmail-lock"
	googleAlert "github.com/pingcap-inc/security/internal/alert-server/controller/v1/google-alert"
	monthlyReport "github.com/pingcap-inc/security/internal/alert-server/controller/v1/monthly-report"
	portScan "github.com/pingcap-inc/security/internal/alert-server/controller/v1/port-scan"
	"github.com/pingcap-inc/security/internal/alert-server/store/mysql"
	"github.com/pingcap-inc/security/internal/pkg/middleware"

	"github.com/pingcap-inc/pchub/pkg/errors"
	"github.com/pingcap-inc/pchub/pkg/util/ginres"
)

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

func installController(g *gin.Engine) *gin.Engine {
	g.NoRoute(func(c *gin.Context) {
		ginres.WriteResponse(c, errors.New("Not found"), nil)
	})

	storeIns, _ := mysql.GetMySQLFactoryOr(nil)
	storeSecurityIns, _ := mysql.GetMySQLFactoryOr2()

	// health
	outRoute := g.Group("", middleware.Auth(1))
	outRoute.GET("/health", func(c *gin.Context) {
		ginres.WriteResponse(c, nil, "service is healthy!")
	})

	// lark callback
	contractCtrl := contractScan.NewDownloadAlertController(storeSecurityIns)
	larkRoute := g.Group("/lark")
	larkRoute.POST("/company", contractCtrl.HandleEvent)

	// inter
	interRoute := g.Group("", middleware.Auth(0))
	inter := interRoute.Group("/inter")
	{
		publicv1 := inter.Group("")
		googleAlertCtrl := googleAlert.NewGoogleAlertController(storeIns)
		publicv1.POST("/check-google-alerts", googleAlertCtrl.CheckGoogleAlerts)
		portScanCtrl := portScan.NewPortScanController(storeIns)
		publicv1.POST("/check-ports", portScanCtrl.Scan)
		downCtrl := downloadAlert.NewDownloadAlertController(storeIns)
		publicv1.POST("/check-downloads", downCtrl.DownloadAlert)
		monthCtrl := monthlyReport.NewMonthlyReportController(storeIns)
		publicv1.POST("/monthly-report", monthCtrl.GetMonthlyReport)
		feilianCtrl := feilianAlert.NewFeilianAlertController(storeIns)
		publicv1.POST("/feilian-alert", feilianCtrl.FeilianAlert)
		gmailCtrl := gmailLock.NewGmailLockController(storeIns)
		publicv1.POST("/gmail-lock", gmailCtrl.GmailLock)

		docCtrl := docCheck.NewDocCheckController(storeIns)
		publicv1.POST("/doc-check", docCtrl.CheckDoc)
		publicv1.POST("/up-docs", docCtrl.RetrieveDocs)

		publicv1.POST("/company", contractCtrl.ContractScan)
		publicv1.POST("/fsc", contractCtrl.Fsc)
		publicv1.POST("/duns", contractCtrl.DunCk)

		exCtrl := externalUser.NewExternalUserController(storeIns)
		publicv1.POST("/external-user", exCtrl.Start)

		publicv1.POST("/test", contractCtrl.TestBitbale)
	}

	return g
}
