// 创建数据库表基本接口
// 秒寻科技
// zt 2024-01-04

package dbtableapi

import (
	"errors"
	"ipsomc/core/company/companymodel"
	"ipsomc/core/dao/mysql/mysqlapi"
	"ipsomc/core/user/usermodel"
	"ipsomc/core/usermobile/usermobilemodel"
	"ipsomc/module/bparam/bparammodel"
	"ipsomc/module/project/projectmodel"
	"ipsomc/util"
	"strconv"
	"strings"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type DbTableApi struct {
	mySql mysqlapi.MySqlApi
}

type OnePermission struct {
	Name string `json:"name"`
	Flag string `json:"flag"`
	Desc string `json:"desc"`
}

var (
	//系统页面
	defaultPageList []OnePermission = []OnePermission{{"系统首页", "dashboard", "可访问首页"}, {"权限管理", "permission", "可访问权限管理页面"}, {"管理角色", "role", "可访问角色管理页面"}, {"员工管理", "operator", "可访问员工管理页面"}, {"项目管理", "project", "可访问项目管理页面"}, {"基站基本参数", "baseparam", "可访问基站基本参数页面"}, {"基站拓扑参数", "btstopology", "可访问基站拓扑参数页面"}, {"公司资料", "company", "可访问公司资料页面"}}

	//平台管理员默认访问页面
	superUserPageList []string = []string{"dashboard", "permission", "company"}

	//系统用户默认访问页面
	sysUserPageList []string = []string{"dashboard", "project", "role", "operator"}

	//黑名单页面
	blackPageList []string = []string{"permission"}
)

// GenerateDbTable 创建表
func (obj *DbTableApi) GenerateDbTable() {

	//管理端模型
	obj.mySql.GenerateDbTable(&companymodel.Company{})     //公司
	obj.mySql.GenerateDbTable(&usermodel.Role{})           //管理角色
	obj.mySql.GenerateDbTable(&usermodel.Permission{})     //管理权限
	obj.mySql.GenerateDbTable(&usermodel.Operator{})       //操作员
	obj.mySql.GenerateDbTable(&projectmodel.Project{})     //项目
	obj.mySql.GenerateDbTable(&bparammodel.BtsBaseParam{}) //基站基本参数

	//移动端模型
	obj.mySql.GenerateDbTable(&usermobilemodel.UserMobile{}) //基站基本参数

	/*********************************************初始化数据********************************************/
	//创建默认权限
	obj.GenDefaultPermission()

	//创建平台管理员角色
	obj.GenSuperRole()

	//添加平台管理员
	obj.GenSuperOperator()

	//创建系统管理员角色
	obj.GenSystemRole()
}

// 创建系统默认权限
func (obj *DbTableApi) GenDefaultPermission() error {

	for _, v := range defaultPageList {
		var permissionMode usermodel.Permission

		//查重
		var count int = 0
		if err := obj.mySql.GetDb().Model(&permissionMode).Where("flag=? and type_id=?", v.Flag, 1).Count(&count).Error; err != nil {
			return err
		}

		//没有记录
		if count <= 0 {
			permissionMode.TypeID = 1    //页面权限
			permissionMode.Name = v.Name //页面名称
			permissionMode.Flag = v.Flag //页面标识符
			permissionMode.Desc = v.Desc
			obj.mySql.AddItem(&permissionMode)
		}
	}

	return nil
}

// 创建默认平台管理员角色
func (obj *DbTableApi) GenSuperRole() error {
	var permissionModel usermodel.Permission
	defaultList := []usermodel.Permission{}
	idList := make([]string, 0)

	//获得所有默认权限
	if err := obj.mySql.GetDb().Model(&permissionModel).Scan(&defaultList).Error; err != nil {
		return err
	}

	//组织默认平台管理员权限
	for _, v := range defaultList {
		for _, page := range superUserPageList {
			if v.Flag == page {
				idList = append(idList, strconv.Itoa(int(v.ID)))
				break
			}
		}
	}

	////查重
	roleModel := usermodel.Role{}
	if err := obj.mySql.GetDb().Model(&roleModel).Where("type_id=?", 1).First(&roleModel).Error; err != nil {
		if err != gorm.ErrRecordNotFound {
			return err
		}
	}
	//没有记录
	if roleModel.ID <= 0 {
		//增加默认角色，并分配权限
		roleModel.TypeID = 1 //平台管理角色
		roleModel.Name = "平台管理角色"
		roleModel.Desc = "管理系统权限"
		roleModel.Permission = strings.Join(idList, ",") //为角色分配权限
		obj.mySql.AddItem(&roleModel)
	} else {
		//修改角色权限
		if err := obj.mySql.GetDb().Model(roleModel).Update("permission", strings.Join(idList, ",")).Error; err != nil {
			return err
		}
	}

	return nil

}

// 创建默认平台管理员
func (obj *DbTableApi) GenSuperOperator() error {
	roleModel := new(usermodel.Role)

	//获得平台管理员的默认角色
	if err := obj.mySql.GetDb().Model(roleModel).Where("type_id=?", 1).First(roleModel).Error; err != nil {
		return err
	}
	if roleModel.ID <= 0 {
		return errors.New("平台管理员角色为空")
	}

	//查重
	dataModel := usermodel.Operator{}
	var count int = 0
	if err := obj.mySql.GetDb().Model(&dataModel).Where("user_name=?", "iamadmin").Count(&count).Error; err != nil {
		return err
	}
	//没有记录，则新增记录
	if count <= 0 {
		//生成默认密码
		var tmpChar string = "12345678"
		password, err := util.EncryptAes([]byte(tmpChar)) //加密
		if err != nil {
			return err
		}

		//增加默认操作员，并分配角色
		dataModel.UserTypeID = 1 //平台管理员
		dataModel.UserName = "iamadmin"
		dataModel.Nickname = "平台管理员"
		dataModel.Password = password
		dataModel.Role = strconv.Itoa(int(roleModel.ID))

		obj.mySql.AddItem(&dataModel)                                       //新增记录
		obj.mySql.GetDb().Model(dataModel).Update("owner_id", dataModel.ID) //修改记录的ownerID
	}

	return nil
}

// 创建系统管理员角色
func (obj *DbTableApi) GenSystemRole() error {
	var permissionModel usermodel.Permission
	defaultList := []usermodel.Permission{}
	idList := make([]string, 0)

	//获得所有默认权限
	if err := obj.mySql.GetDb().Model(&permissionModel).Scan(&defaultList).Error; err != nil {
		return err
	}

	//组织默认系统管理员权限
	for _, v := range defaultList {
		for _, page := range sysUserPageList {
			if v.Flag == page {
				idList = append(idList, strconv.Itoa(int(v.ID)))
				break
			}
		}
	}

	////角色查重
	roleModel := new(usermodel.Role)
	if err := obj.mySql.GetDb().Model(roleModel).Where("type_id=?", 2).First(roleModel).Error; err != nil {
		if err != gorm.ErrRecordNotFound {
			return err
		}
	}
	//没有角色记录
	if roleModel.ID <= 0 {
		//增加默认角色，并分配权限
		roleModel.TypeID = 2 //系统管理角色
		roleModel.Name = "系统管理角色"
		roleModel.Desc = "负责创建公司项目、创建管理角色、创建员工账号、为员工分配操作权限"
		roleModel.Permission = strings.Join(idList, ",") //为角色分配权限
		obj.mySql.AddItem(&roleModel)
	} else {
		//修改角色权限
		if err := obj.mySql.GetDb().Model(roleModel).Update("permission", strings.Join(idList, ",")).Error; err != nil {
			return err
		}
	}

	return nil
}

// 获得系统用户默认权限(系统用户注册时分配的默认权限)
func (obj *DbTableApi) GetSysUserDefaultPermission() []string {
	return sysUserPageList
}

// 获得普通用户访问黑名单
func (obj *DbTableApi) GetBlackPageList() []string {
	return blackPageList
}
