package common

import (
	"bytes"
	"dbweb/core"
	"encoding/gob"
	"encoding/json"
	"io/ioutil"
)

//BillClone 业务类
type BillClone struct{}
type billClonePostData struct {
	DBName    string
	BillName  string
	OldSignPK string
	NewPK     map[string]interface{}
}
type billCloneResult struct {
	Ok    bool
	Error string
}

///
func init() {
	core.RegisterFun("billclone", new(BillClone))
}

//Post 业务
func (b *BillClone) Post(p *core.ElementHandleArgs) {
	body, err := ioutil.ReadAll(p.Req.Body)
	if err != nil {
		core.LOG.Panic(err)
	}
	out := billClonePostData{}
	if err = json.Unmarshal(body, &out); err != nil {
		core.LOG.Panic(err)
	}
	c := core.FindController(out.BillName)
	srcBill := core.LoadModel(c.ModelName).Bill()
	if err != nil {
		core.LOG.Panic(err)
	}
	//将旧主键值取出
	in := bytes.NewBufferString(p.User.DecodeQueryValue(out.OldSignPK))
	oldPK := []interface{}{}
	if err := gob.NewDecoder(in).Decode(&oldPK); err != nil {
		core.LOG.Panic(err)
	}
	//取出旧记录
	record, err := srcBill.Record(oldPK...)
	if err != nil {
		core.LOG.Panic(err)
	}
	rev := billCloneResult{}
	if record.IsEmpty() {
		rev.Ok = false
		rev.Error = "源记录找不到"
		p.Render.JSON(200, rev)
		return
	}

	//修改记录的主键
	newPK := []interface{}{}
	for _, v := range srcBill.Main.PrimaryKeys {
		newPK = append(newPK, out.NewPK[v])
	}
	srcBill.ChangeKeyValues(record, newPK...)
	//先检测新主键是否存在
	if b, err := srcBill.Main.KeyExists(srcBill.Main.KeyValues(record.Main)...); err != nil {
		core.LOG.Panic(err)
	} else if b {
		rev.Ok = false
		rev.Error = "新的主键已经存在，不能克隆"
		p.Render.JSON(200, rev)
		return
	}
	if err := srcBill.Insert(record); err != nil {
		rev.Ok = false
		rev.Error = err.Error()
		p.Render.JSON(200, rev)
		return
	}
	rev.Ok = true
	p.Render.JSON(200, rev)
	return
}
