package common

import (
	"bytes"
	"dbweb/core"
	"dbweb/lib/model"
	"text/template"

	"github.com/linlexing/dbx/ddb"

	"github.com/linlexing/dbx/data"
)

const (
	modelRoleName   = "ROLE"
	modelCRRoleName = "CR_ROLE"
)

type modelRoleEle struct {
	RoleName string `dbx:"STR(50) PRIMARY KEY"`
	EleName  string `dbx:"STR(50) PRIMARY KEY"`
}
type modelRole struct {
	Name    string         `dbx:"STR(50) PRIMARY KEY"`
	Dept    string         `dbx:"STR(50) NOT NULL"`
	Visible string         `dbx:"STR"`
	Eles    []modelRoleEle `dbx:"ROLEELE CHILD"`
}
type role struct{}
type DBRole struct {
	Name    string
	Dept    string
	Visible string
}

func (r modelRole) OnAfterSchemaUpdate(md *model.Model, oldver int64) error {
	if oldver == 0 {
		return md.Set(modelRole{
			Name: "system",
			Dept: "r",
			Eles: []modelRoleEle{
				modelRoleEle{
					RoleName: "system",
					EleName:  "impins",
				},
			},
		})
	}

	return nil
}
func init() {
	core.RegisterModel(modelRole{}, 1, true, modelRoleName)
	core.RegisterBill("role", new(role), modelRoleName)
	core.RegisterInstitutionModel(core.DeptRoot, modelRoleName,
		"dept in ({{P .User.ToRootDeptCodesAndSelf}})", "", "")
}
func ChangeElementRole(db ddb.DB, oldName, newName string) error {
	_, err := db.Exec("update roleele set elename=? where elename=?", newName, oldName)
	return err
}
func RemoveElementRole(db ddb.DB, name string) error {
	_, err := db.Exec("delete from roleele where elename=?", name)
	return err

}
func (r *role) Get(p *core.BillGetHandleArgs) {
	strSql := "select name from element where dept in (?) order by name"
	str, pam, err := data.In(strSql, p.User.ToRootDeptCodesAndSelf())
	if err != nil {
		core.LOG.Panic(err)
	}

	elementNames, err := ddb.ScanStrings(p.DB, str, pam...)
	if err != nil {
		core.LOG.Panic(err)
	}
	p.More["ElementNames"] = elementNames
	p.HTML()
}
func (r *DBRole) IsShow(user *core.User) bool {
	if len(r.Visible) == 0 {
		return false
	}
	t, err := template.New("role").Parse(r.Visible)
	if err != nil {
		core.LOG.Panic(err)
	}
	bys := bytes.NewBuffer(nil)
	if err = t.Execute(bys, map[string]interface{}{"Role": r, "User": user}); err != nil {
		core.LOG.Panic(err)
	}
	return bys.String() == "1"
}
