package alert_server

import (
	"net/http"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"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"
	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(storeSecurityIns)
		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)

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

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

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

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

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

		webServiceCtrl := contractScan.NewWebServiceController(storeSecurityIns)
		webRroup.GET("/company/list", webServiceCtrl.Company)
		webRroup.GET("/company/fresh_information", webServiceCtrl.FreshInformation)
		webRroup.GET("/company_basic/list", webServiceCtrl.CompanyBasic)
		webRroup.GET("/problem/list", webServiceCtrl.CompanyProblems)
		webRroup.GET("/sanction/list", webServiceCtrl.CompanySanctions)
		webRroup.GET("/reference/list", webServiceCtrl.CompanyReferences)
		webRroup.GET("/company_info_principalscontacts/list", webServiceCtrl.CompanyInfoPrincipalsContacts)

		webRroup.POST("reset_companies", webServiceCtrl.ResetCompanies)
	}

	return g
}
