package common

import (
	"dbweb/core"
	"dbweb/lib/safe"
	"dbweb/modules/common/recordview"
	"encoding/json"
	"fmt"
)

type outerDB struct{}

func init() {
	core.RegisterBill("outerdb", new(outerDB), core.ModelOuterdbName)
}
func (o *outerDB) Post(p *core.BillPostHandleArgs) {
	var out core.ModelOuterDB
	if err := p.NewRecord.Scan(&out); err != nil {
		core.LOG.Panic(err)
	}
	core.RemoveOuterDBFromCache(out.Name)
	p.Process()
}
func (o *outerDB) Delete(p *core.BillDeleteHandleArgs) {
	var out core.ModelOuterDB
	if err := p.OldRecord.Scan(&out); err != nil {
		core.LOG.Panic(err)
	}
	core.RemoveOuterDBFromCache(out.Name)
	p.Remove()
}
func (o *outerDB) Get(p *core.BillGetHandleArgs) {
	if p.Element.Name == "OuterDBTableMng" {
		dbName := safe.String(p.Record.Main["NAME"])
		keyColName := "NAME"
		strSql := ""
		switch safe.String(p.Record.Main["DRIVER"]) {
		case "oci8":
			strSql = "SELECT TABLE_NAME AS NAME FROM USER_TABLES"
		case "mysql":
			strSql = "select table_name as NAME from information_schema.tables where table_schema=schema()"
		case "postgres":
			keyColName = "name"
			strSql = "SELECT table_name as NAME FROM information_schema.tables WHERE table_schema=current_schema() AND table_type='BASE TABLE'"
		case "sqlite3":
			strSql = "SELECT NAME FROM my_db.sqlite_master WHERE type='table'"
		default:
			core.LOG.Panic("not impl")
		}
		query := map[string]interface{}{
			"db": dbName,
		}
		bys, _ := json.Marshal(query)
		recordViewParam := recordview.RecordViewParam{
			DB:          dbName,
			Sql:         strSql,
			ManualPage:  false,
			TableName:   "",
			UniqueField: []string{keyColName},
			Columns:     nil,
			Processes: []*recordview.RecordViewProcess{
				&recordview.RecordViewProcess{
					Name:        "数据管理",
					ElementName: "opentable",
					BindRecord:  true,
					TransQuery:  string(bys),
				},
				&recordview.RecordViewProcess{
					Name:        "结构查询",
					ElementName: "browsetabledef",
					BindRecord:  true,
					TransQuery:  string(bys),
				},
			},
		}
		rname := fmt.Sprintf("%s_表管理", dbName)
		if err := core.LoadModel(core.ModelElementName).Set(&ModelRecordViewElement{
			ModelElementNoParam: core.ModelElementNoParam{
				Name:       rname,
				Label:      rname,
				Category:   rname,
				Controller: CtrlRecordViewName,
				Pub:        core.False,
				Owner:      core.ElementOwnerAutoCreate,
				UserName:   p.User.Name,
				Dept:       p.User.Dept.Code,
				NewWindow:  core.False,
				HelpText:   "",
			},
			Params: recordViewParam,
		}); err != nil {
			core.LOG.Panic(err)
		}

		p.Redirect(p.User.Sign("/" + rname))
	} else {
		p.HTML()
	}
}
