package common

import (
	"dbweb/core"
	"dbweb/lib/uri"
	"dbweb/modules/common/recordview"
	"encoding/json"
	"fmt"
	"strings"

	"dbweb/modules/common/impt"

	"github.com/linlexing/dbx/scan"
	"github.com/linlexing/dbx/schema"
)

type openTable struct{}

func init() {
	core.RegisterFun("opentable", new(openTable))
}
func (o *openTable) Get(p *core.ElementHandleArgs) {
	q := p.Req.URL.Query()

	dbName := p.User.DecodeQueryValue(q.Get("db"))
	tableName, err := uri.DecodeUriCompontent(strings.Split(p.Req.URL.Path, "/")[2])
	if err != nil {
		core.LOG.Panic(err)
	}
	eleLabel := p.User.DecodeQueryValue(q.Get("elelabel"))
	eleCategory := p.User.DecodeQueryValue(q.Get("elecate"))

	dataDB := core.LoadOuterDB(p.DB, dbName)
	table, err := schema.Find(dataDB.DriverName()).OpenTable(dataDB, tableName)
	if err != nil {
		core.LOG.Panic(err)
	}
	cols := []*scan.ColumnType{}
	impFields := []*impt.ImportParamField{}
	for _, v := range table.Columns {
		cols = append(cols, &scan.ColumnType{Name: v.Name, Type: v.Type})
		style := impt.ImportFieldStyleNormal
		for _, one := range table.PrimaryKeys {
			if one == v.Name {
				style = impt.ImportFieldStyleMust
				break
			}
		}

		impFields = append(impFields, &impt.ImportParamField{
			Name:  v.Name,
			Style: style,
		})
	}
	transQuery := map[string]interface{}{
		"db":     dbName,
		"tables": tableName,
	}
	bys, err := json.Marshal(transQuery)
	if err != nil {
		core.LOG.Panic(err)
	}
	if len(eleLabel) == 0 {
		eleLabel = tableName
	}
	if len(eleCategory) == 0 {
		str := dbName
		if len(str) == 0 {
			str = "(当前数据库)"
		}
		eleCategory = fmt.Sprintf("(数据库)/%s", str)
	}
	importElement := &impt.ModelImportElement{
		ModelElementNoParam: core.ModelElementNoParam{
			Name:       fmt.Sprintf("%s_%s_导入", dbName, tableName),
			Label:      "",
			Category:   eleCategory,
			Controller: ctrlImportName,
			Pub:        core.False,
			Owner:      core.ElementOwnerAutoCreate,
			UserName:   p.User.Name,
			Dept:       p.User.Dept.Code,
			NewWindow:  core.False,
			HelpText:   "",
		},
		Params: impt.ImportParam{
			DB:     dbName,
			Table:  tableName,
			Fields: impFields,
		},
	}
	rec := &ModelRecordViewElement{
		ModelElementNoParam: core.ModelElementNoParam{
			Name:       fmt.Sprintf("%s_%s_管理", dbName, tableName),
			Label:      eleLabel,
			Category:   eleCategory,
			Controller: CtrlRecordViewName,
			Pub:        core.False,
			Owner:      core.ElementOwnerAutoCreate,
			UserName:   p.User.Name,
			Dept:       p.User.Dept.Code,
			NewWindow:  core.False,
			HelpText:   "",
		},
		Params: recordview.RecordViewParam{
			DB:          dbName,
			Sql:         "", //为了优化数据，mysql嵌套查询会不能使用索引
			ManualPage:  true,
			TableName:   tableName,
			UniqueField: table.PrimaryKeys,
			Columns:     nil,
			AllColumns:  cols,
			Processes: []*recordview.RecordViewProcess{
				&recordview.RecordViewProcess{
					Name:        "新增",
					ElementName: "generic_add",
					BindRecord:  false,
					TransQuery:  string(bys),
				},
				&recordview.RecordViewProcess{
					Name:        "修改",
					ElementName: "generic_edit",
					BindRecord:  true,
					TransQuery:  string(bys),
				},
				&recordview.RecordViewProcess{
					Name:        "删除",
					ElementName: "generic_delete",
					BindRecord:  true,
					TransQuery:  string(bys),
				},
				&recordview.RecordViewProcess{
					Name:        "导入",
					ElementName: importElement.Name,
					BindRecord:  false,
					WithSql:     true,
				},
				&recordview.RecordViewProcess{
					Name:        "导出",
					ElementName: "export",
					BindRecord:  false,
					WithSql:     true,
				},
				&recordview.RecordViewProcess{
					Name:        "批量删除",
					ElementName: "removesel",
					BindRecord:  false,
					WithSql:     true,
				},
				&recordview.RecordViewProcess{
					Name:        "汇总",
					ElementName: "total",
					BindRecord:  false,
					WithSql:     true,
				},
				&recordview.RecordViewProcess{
					Name:        "连续操作",
					ElementName: "SequenceOperate",
					BindRecord:  false,
					WithSql:     true,
				},
			},
		},
	}
	mdElement := core.LoadModel(core.ModelElementName)
	core.LOG.Println("save import")
	if err := mdElement.Set(importElement); err != nil {
		core.LOG.Panic(err)
	}
	core.LOG.Println("save element")
	if err := mdElement.Set(rec); err != nil {
		core.LOG.Panic(err)
	}
	p.Redirect(p.User.Sign("/" + rec.Name))
}
