package model

import (
	operationPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/operation"
	"time"
)

const (
	Level1 = iota + 1
	Level2
	Level3
)

type SystemMenu struct {
	Id        int64                   `json:"id,omitempty"`
	Name      string                  `json:"name,omitempty"`
	MenuType  int32                   `json:"menu_type,omitempty"`
	Level     int32                   `json:"level,omitempty"`
	Title     string                  `json:"title,omitempty"`
	Path      string                  `json:"path,omitempty"`
	IsShow    operationPb.IsShow_Kind `json:"is_show,omitempty"`
	IsDelete  operationPb.IsShow_Kind `json:"is_delete,omitempty"`
	Component string                  `json:"component,omitempty"`
	Icon      string                  `json:"icon,omitempty"`
	Sort      int32                   `json:"sort,omitempty"`
	ParentId  int64                   `json:"parent_id"`
	Redirect  string                  `json:"redirect,omitempty"`
	CreatedAt int64                   `json:"created_at,omitempty"`
	UpdatedAt int64                   `json:"updated_at,omitempty"`
}

func (s *SystemMenu) TableName() string {
	return "system_menu"
}

func NewSystemMenu(req *operationPb.AddMenuRequest) *SystemMenu {
	return &SystemMenu{
		Name:      req.Name,
		MenuType:  req.MenuType,
		Level:     req.Level,
		Title:     req.Title,
		Path:      req.Path,
		Component: req.Component,
		Icon:      req.Icon,
		Sort:      req.Sort,
		Redirect:  req.Redirect,
		ParentId:  int64(req.ParentId),
		IsShow:    operationPb.IsShow_OK,
		IsDelete:  operationPb.IsShow_OK,
	}
}

type SystemMenuSlice []*SystemMenu

func (s SystemMenuSlice) ToPB() []*operationPb.AddMenuRequest {
	level := make(map[int32][]*operationPb.AddMenuRequest, 0)
	for _, menu := range s {
		if _, ok := level[menu.Level]; !ok {
			level[menu.Level] = make([]*operationPb.AddMenuRequest, 0)
		}
		level[menu.Level] = append(level[menu.Level], &operationPb.AddMenuRequest{
			Id:              int32(menu.Id),
			Name:            menu.Name,
			ParentId:        int32(menu.ParentId),
			MenuType:        menu.MenuType,
			Title:           menu.Title,
			Path:            menu.Path,
			IsShow:          menu.IsShow,
			Component:       menu.Component,
			Icon:            menu.Icon,
			Sort:            menu.Sort,
			Redirect:        menu.Redirect,
			CreatedAt:       int32(menu.CreatedAt),
			CreatedAtFormat: time.Unix(menu.CreatedAt, 0).Format(LayoutTime),
			Level:           menu.Level,
			Affix:           true,
			KeepAlive:       true,
			Children:        make([]*operationPb.AddMenuRequest, 0),
		})
	}

	for _, leve3Data := range level[Level3] {
		for _, leve2Data := range level[Level2] {
			if leve3Data.ParentId == leve2Data.Id {
				if leve2Data.Children == nil {
					leve2Data.Children = make([]*operationPb.AddMenuRequest, 0)
				}
				leve2Data.Children = append(leve2Data.Children, leve3Data)
			}
		}
	}

	for _, leve2Data := range level[Level2] {
		for _, leve1Data := range level[Level1] {
			if leve2Data.ParentId == leve1Data.Id {
				if leve1Data.Children == nil {
					leve1Data.Children = make([]*operationPb.AddMenuRequest, 0)
				}
				leve1Data.Children = append(leve1Data.Children, leve2Data)
			}
		}
	}

	return level[Level1]
}

func (s *SystemMenu) ToPb() *operationPb.AddMenuRequest {
	return &operationPb.AddMenuRequest{
		Id:              int32(s.Id),
		Name:            s.Name,
		MenuType:        s.MenuType,
		Level:           s.Level,
		Title:           s.Title,
		Path:            s.Path,
		Component:       s.Component,
		Icon:            s.Icon,
		Sort:            s.Sort,
		Redirect:        s.Redirect,
		ParentId:        int32(s.ParentId),
		IsShow:          s.IsShow,
		CreatedAt:       int32(s.CreatedAt),
		CreatedAtFormat: time.Unix(s.CreatedAt, 0).Format(LayoutTime),
	}
}