package service

import (
	"blazing/cool"

	"blazing/modules/base/model"

	"github.com/gogf/gf/v2/encoding/gjson"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/net/ghttp"
	"github.com/gogf/gf/v2/text/gstr"
)

type BaseOpenService struct {
	*cool.Service
}

func NewBaseOpenService() *BaseOpenService {
	return &BaseOpenService{
		&cool.Service{},
	}
}

// AdminEPS 获取eps
func (s *BaseOpenService) AdminEPS(ctx g.Ctx) (result *g.Var, err error) {
	c := cool.CacheEPS
	result, err = c.GetOrSetFunc(ctx, "adminEPS", func(ctx g.Ctx) (interface{}, error) {
		return s.creatAdminEPS(ctx)
	}, 0)

	return
}

// creatAdminEPS 创建eps
func (s *BaseOpenService) creatAdminEPS(ctx g.Ctx) (adminEPS interface{}, err error) {
	var (
		baseEpsAdmin = model.NewBaseEpsAdmin()
	)

	type Api struct {
		Module  string `json:"module"`  // 所属模块名称 例如：base
		Method  string `json:"method"`  // 请求方法 例如：GET
		Path    string `json:"path"`    // 请求路径 例如：/welcome
		Prefix  string `json:"prefix"`  // 路由前缀 例如：/admin/base/open
		Summary string `json:"summary"` // 描述 例如：欢迎页面
		Tag     string `json:"tag"`     // 标签 例如：base  好像暂时不用
		Dts     string `json:"dts"`     // 未知 例如：{} 好像暂时不用
	}
	// type Column struct {
	// }
	type Module struct {
		Api     []*Api             `json:"api"`
		Columns []*cool.ColumnInfo `json:"columns"`
		Module  string             `json:"module"`
		Prefix  string             `json:"prefix"`
	}
	admineps := make(map[string][]*Module)
	// 获取所有路由并更新到数据库表 base_eps_admin
	cool.DBM(baseEpsAdmin).Where("1=1").Delete()
	routers := g.Server().GetRoutes()
	for _, router := range routers {
		if router.Type == ghttp.HandlerTypeMiddleware || router.Type == ghttp.HandlerTypeHook {
			continue
		}
		if router.Method == "ALL" {
			continue
		}
		routeSplite := gstr.Split(router.Route, "/")
		if len(routeSplite) < 5 {
			continue
		}
		if routeSplite[1] != "admin" {
			continue
		}
		module := routeSplite[2]
		method := router.Method
		// 获取最后一个元素加前缀 / 为 path
		path := "/" + routeSplite[len(routeSplite)-1]
		// 获取前面的元素为prefix
		prefix := gstr.Join(routeSplite[0:len(routeSplite)-1], "/")
		// 获取最后一个元素为summary
		summary := routeSplite[len(routeSplite)-1]
		cool.DBM(baseEpsAdmin).Insert(&Api{
			Module:  module,
			Method:  method,
			Path:    path,
			Prefix:  prefix,
			Summary: summary,
			Tag:     "",
			Dts:     "",
		})
	}
	// 读取数据库表生成eps
	// var modules []*Module
	items, _ := cool.DBM(baseEpsAdmin).Fields("DISTINCT module,prefix").All()
	for _, item := range items {
		module := item["module"].String()
		prefix := item["prefix"].String()
		apis, _ := cool.DBM(baseEpsAdmin).Where("module=? AND prefix=?", module, prefix).All()
		var apiList []*Api
		for _, api := range apis {
			apiList = append(apiList, &Api{
				Module:  api["module"].String(),
				Method:  api["method"].String(),
				Path:    api["path"].String(),
				Prefix:  api["prefix"].String(),
				Summary: api["summary"].String(),
				Tag:     api["tag"].String(),
				Dts:     api["dts"].String(),
			})
		}
		admineps[module] = append(admineps[module], &Module{
			Api:     apiList,
			Columns: cool.ModelInfo[prefix],
			Module:  module,
			Prefix:  prefix,
		})

	}

	adminEPS = gjson.New(admineps)
	return

}

// AdminEPS 获取eps
func (s *BaseOpenService) AppEPS(ctx g.Ctx) (result *g.Var, err error) {
	c := cool.CacheEPS
	result, err = c.GetOrSetFunc(ctx, "appEPS", func(ctx g.Ctx) (interface{}, error) {
		return s.creatAppEPS(ctx)
	}, 0)

	return
}

// creatAppEPS 创建app eps
func (s *BaseOpenService) creatAppEPS(ctx g.Ctx) (appEPS interface{}, err error) {
	var (
		baseEpsApp = model.NewBaseEpsApp()
	)

	type Api struct {
		Module  string `json:"module"`  // 所属模块名称 例如：base
		Method  string `json:"method"`  // 请求方法 例如：GET
		Path    string `json:"path"`    // 请求路径 例如：/welcome
		Prefix  string `json:"prefix"`  // 路由前缀 例如：/admin/base/open
		Summary string `json:"summary"` // 描述 例如：欢迎页面
		Tag     string `json:"tag"`     // 标签 例如：base  好像暂时不用
		Dts     string `json:"dts"`     // 未知 例如：{} 好像暂时不用
	}
	// type Column struct {
	// }
	type Module struct {
		Api     []*Api             `json:"api"`
		Columns []*cool.ColumnInfo `json:"columns"`
		Module  string             `json:"module"`
		Prefix  string             `json:"prefix"`
	}
	appeps := make(map[string][]*Module)
	// 获取所有路由并更新到数据库表 base_eps_admin
	cool.DBM(baseEpsApp).Where("1=1").Delete()
	routers := g.Server().GetRoutes()
	for _, router := range routers {
		if router.Type == ghttp.HandlerTypeMiddleware || router.Type == ghttp.HandlerTypeHook {
			continue
		}
		if router.Method == "ALL" {
			continue
		}
		routeSplite := gstr.Split(router.Route, "/")
		if len(routeSplite) < 5 {
			continue
		}
		if routeSplite[1] != "app" {
			continue
		}
		module := routeSplite[2]
		method := router.Method
		// 获取最后一个元素加前缀 / 为 path
		path := "/" + routeSplite[len(routeSplite)-1]
		// 获取前面的元素为prefix
		prefix := gstr.Join(routeSplite[0:len(routeSplite)-1], "/")
		// 获取最后一个元素为summary
		summary := routeSplite[len(routeSplite)-1]
		cool.DBM(baseEpsApp).Insert(&Api{
			Module:  module,
			Method:  method,
			Path:    path,
			Prefix:  prefix,
			Summary: summary,
			Tag:     "",
			Dts:     "",
		})
	}
	// 读取数据库表生成eps
	// var modules []*Module
	items, _ := cool.DBM(baseEpsApp).Fields("DISTINCT module,prefix").All()
	for _, item := range items {
		module := item["module"].String()
		prefix := item["prefix"].String()
		apis, _ := cool.DBM(baseEpsApp).Where("module=? AND prefix=?", module, prefix).All()
		var apiList []*Api
		for _, api := range apis {
			apiList = append(apiList, &Api{
				Module:  api["module"].String(),
				Method:  api["method"].String(),
				Path:    api["path"].String(),
				Prefix:  api["prefix"].String(),
				Summary: api["summary"].String(),
				Tag:     api["tag"].String(),
				Dts:     api["dts"].String(),
			})
		}
		appeps[module] = append(appeps[module], &Module{
			Api:     apiList,
			Columns: cool.ModelInfo[prefix],
			Module:  module,
			Prefix:  prefix,
		})

	}

	appEPS = gjson.New(appeps)
	return
}
