package beego

import (
	"net/http"
	"os"
	"strconv"

	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_manufacture"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/allied_creation_user"
	chart_editor "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/chart-editor"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/infrastructure/service_gateway/cost_structured"

	"github.com/beego/beego/v2/server/web/context"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/constant"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/port/beego/middleware"

	"github.com/beego/beego/v2/server/web"
	"github.com/linmadan/egglib-go/web/beego/filters"
	"gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/log"
	_ "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/port/beego/routers"
)

func init() {
	web.BConfig.AppName = "project"
	web.BConfig.CopyRequestBody = true
	web.BConfig.RunMode = "dev"
	web.BConfig.Listen.HTTPPort = constant.HTTP_PORT

	web.BConfig.Listen.EnableAdmin = false
	web.BConfig.WebConfig.CommentRouterPath = "/pkg/port/beego/routers"
	if os.Getenv("RUN_MODE") != "" {
		web.BConfig.RunMode = os.Getenv("RUN_MODE")
	}
	if os.Getenv("HTTP_PORT") != "" {
		portStr := os.Getenv("HTTP_PORT")
		if port, err := strconv.Atoi(portStr); err == nil {
			web.BConfig.Listen.HTTPPort = port
		}
	}
	//https支持
	web.BConfig.Listen.EnableHTTPS = false
	web.BConfig.Listen.HTTPSPort = 443
	web.BConfig.Listen.HTTPSCertFile = "./config/fjmaimaimai.com_bundle.crt"
	web.BConfig.Listen.HTTPSKeyFile = "./config/fjmaimaimai.com.key"
	if os.Getenv("HTTPS_PORT") != "" {
		portStr := os.Getenv("HTTPS_PORT")
		if port, err := strconv.Atoi(portStr); err == nil {
			web.BConfig.Listen.HTTPSPort = port
		}
	}

	filters.SecureKeyMap["token"] = "x-mmm-accesstoken"
	web.InsertFilter("/*", web.BeforeRouter, AllowCors())
	web.InsertFilter("/*", web.BeforeRouter, filters.CreateRequstLogFilter(log.Logger))
	web.InsertFilter("/v1/background/*", web.BeforeExec, middleware.CheckAccessToken())
	web.InsertFilter("/v1/web/*", web.BeforeExec, middleware.CheckAccessToken())
	web.InsertFilter("/v1/app/*", web.BeforeExec, middleware.CheckAccessToken())
	web.InsertFilter("/v1/user/*", web.BeforeExec, middleware.CheckAccessToken())
	web.InsertFilter("/*", web.AfterExec, filters.CreateResponseLogFilter(log.Logger), web.WithReturnOnOutput(false))
	//web.InsertFilter("/v1/app11/*", web.BeforeExec, filters.SecureHandler(
	//	filters.WithEnableCheckTimestamp(false),
	//	filters.WithOnInvalidRequest(func(ctx *context.Context) {
	//		headerData, _ := json.Marshal(ctx.Input.Context.Request.Header)
	//		log.Logger.Info("签名验证失败:" + string(headerData))
	//	}),
	//))

	web.InsertFilter("/v1/common/user/area/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/common/user", allied_creation_user.NewHttplibAlliedCreationUser(domain.Operator{})))

	web.InsertFilter("/v1/manufacture/*", web.BeforeRouter, middleware.CheckAccessToken())
	web.InsertFilter("/v1/manufacture/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/manufacture", allied_creation_manufacture.NewHttpLibAlliedCreationManufacture(domain.Operator{})))
	web.InsertFilter("/v1/cost/*", web.BeforeRouter, middleware.CheckAccessToken())
	web.InsertFilter("/v1/cost/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/cost", cost_structured.NewHttpLibCostStructured(domain.Operator{})))
	web.InsertFilter("/v1/chart-editor/*", web.BeforeRouter, middleware.CheckAccessToken())
	web.InsertFilter("/v1/chart-editor/*", web.BeforeRouter, middleware.RedirectInternalService("/v1/chart-editor", chart_editor.NewHttpLibAlliedChartEditor(domain.Operator{})))
}

func AllowCors() func(ctx *context.Context) {
	return func(ctx *context.Context) {
		ctx.Output.Header("Access-Control-Allow-Methods", "OPTIONS,DELETE,POST,GET,PUT,PATCH")
		ctx.Output.Header("Access-Control-Allow-Headers", "Content-Type,X-Mmm-Accesstoken,X-Mmm-Devicetype,X-Mmm-Sign,X-Mmm-Timestamp,X-Mmm-Uuid,X-Mmm-Version,x-mmm-appname,*")
		ctx.Output.Header("Access-Control-Allow-Credentials", "true")
		ctx.Output.Header("Access-Control-Allow-Origin", "*") //origin
		if ctx.Input.Method() == http.MethodOptions {
			// options请求,返回200
			ctx.Output.SetStatus(http.StatusOK)
			_ = ctx.Output.Body([]byte("options support"))
		}
	}
}