package system

import (
	"fmt"
	"github.com/flipped-aurora/gin-vue-admin/server/global"
	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
	"github.com/pkg/errors"
	"strings"
)

var ViewAuthorityMenuPostgres = new(viewAuthorityMenuPostgres)

type viewAuthorityMenuPostgres struct{}

func (a *viewAuthorityMenuPostgres) TableName() string {
	var entity system.SysMenu
	return entity.TableName()
}

func (a *viewAuthorityMenuPostgres) Initialize() error {
	var entity AuthorityMenus
	sql := `
	CREATE VIEW @table_name as
	select @menus.id                       as id,
		   @menus.path                     as path,
		   @menus.name                     as name,
		   @menus.icon                     as icon,
		   @menus.sort                     as sort,
		   @menus.title                    as title,
		   @menus.hidden                   as hidden,
		   @menus.parent_id                as parent_id,
		   @menus.component                as component,
		   @menus.keep_alive               as keep_alive,
		   @menus.created_at               as created_at,
		   @menus.updated_at               as updated_at,
		   @menus.deleted_at               as deleted_at,
		   @menus.menu_level               as menu_level,
		   @menus.default_menu             as default_menu,
		   @authorities_menus.menu_id      as menu_id,
		   @authorities_menus.authority_id as authority_id
	from (@authorities_menus join @menus on ((@authorities_menus.menu_id = @menus.id)));`
	sql = strings.ReplaceAll(sql, "@table_name", a.TableName())
	sql = strings.ReplaceAll(sql, "@menus", "sys_base_menus")
	sql = strings.ReplaceAll(sql, "@authorities_menus", entity.TableName())
	if err := global.GVA_DB.Exec(sql).Error; err != nil {
		return errors.Wrap(err, a.TableName()+"视图创建失败!")
	}
	return nil
}

func (a *viewAuthorityMenuPostgres) CheckDataExist() bool {
	err1 := global.GVA_DB.Find(&[]system.SysMenu{}).Error
	err2 := errors.New(fmt.Sprintf("Error 1146: Table '%v.%v' doesn't exist", global.GVA_CONFIG.Pgsql.Dbname, a.TableName()))
	if errors.As(err1, &err2) {
		return false
	}
	return true
}