package common

import (
	"bytes"
	"dbweb/core"

	"github.com/linlexing/dbx/data"
	"github.com/linlexing/dbx/schema"

	"dbweb/lib/safe"
	"strings"

	"encoding/csv"
)

const modelTableCheckName = "TABLECHECK"

type tableCheck struct{}
type modelTableCheck struct {
	ID          string `dbx:"str(20) primary key"`
	Label       string `dbx:"str(300) not null"`
	TableName   string `dbx:"str(50) not null"`
	Must        int64  `dbx:"int not null"`
	Condition   string `dbx:"str"`
	ReferFields string `dbx:"str not null"`
	DetailTmpl  string `dbx:"str"`
	Dept        string `dbx:"str(50) not null"`
}

func init() {
	core.RegisterModel(modelTableCheck{}, 1, false, modelTableCheckName)
	core.RegisterBill("tablecheck", new(tableCheck), modelTableCheckName)
	core.RegisterInstitutionModel(core.DeptRoot, modelTableCheckName,
		"dept in ({{P .User.ToRootDeptCodesAndSelf}})", "", "")
}
func (t *tableCheck) Get(p *core.BillGetHandleArgs) {
	if p.Req.URL.Query().Get("action") == "gf" {
		tname := p.Req.URL.Query().Get("tname")
		tab, err := data.OpenTable(p.DB.DriverName(), p.DB, tname)
		if err != nil {
			core.LOG.Panic(err)
		}

		p.Render.JSON(200, tab.ColumnNames)
		return
	}
	//暂时不考虑支持外部数据库

	names, err := schema.Find(p.DB.DriverName()).TableNames(p.DB)
	if err != nil {
		core.LOG.Panic(err)
	}
	ls := []string{}
	//需要过滤掉审核结果表
	for _, one := range names {
		if !strings.HasPrefix(one, "CR_") {
			ls = append(ls, one)
		}
	}
	p.Field("TABLENAME").More["Options"] = ls
	if tname := safe.String(p.Record.Main["TABLENAME"]); len(tname) > 0 {
		tab, err := data.OpenTable(p.DB.DriverName(), p.DB, tname)
		if err != nil {
			core.LOG.Error(err)
		} else {
			p.Field("REFERFIELDS").More["Options"] = tab.ColumnNames
		}
	}
	if rf := safe.String(p.Record.Main["REFERFIELDS"]); len(rf) > 0 {
		p.Field("REFERFIELDS").More["Values"], _ = csv.NewReader(bytes.NewBufferString(rf)).Read()
	}
	p.HTML()
}
